Edward Z. Yang wrote:
(And even that's not enough, since something like $(map json ts) counts as a typeclass witness too--so what is a witness, anyway?)

Yes, records built by mapping over type classes are also witnesses. :)

Yeah, here is the ambiguity thing, since there exists a destr2R but
it doesn't have the right signature here.

map2 is useful.  With it, I get here:

     {ToJson = fn r =>  let val jsts = @map2 [json] [fn _ =>  string] [fn x =>  
json x * string]
                                      (fn [t] (js : json t) (t : string) =>  
(js, t)) fl jss names
                       in @Variant.destrR [ident] [fn x =>  json x * string]
                           (fn [p] (v : p) (js : json p, t : string) =>  
"something") fl r jsts
                       end

I can't get this to unify:

     /home/ezyang/Dev/logitext/meta/json.ur:273:26-273:83: Unification failure
     Expression:
     fn p ::: Type =>
      fn v : p =>
       fn $x : {1 : json p, 2 : string} =>
        case $x of {1 = js, 2 = t} =>  "something"
       Have con:
     p ::: Type ->
      (p ->
        ({1 :
           {ToJson : (p ->  string),
             FromJson : (string ->  {1 : p, 2 : string})}, 2 : Basis.string}
          ->  Basis.string))
       Need con:
     p :: Type ->
      (p ->
        ({1 :
           {ToJson : (p ->  string),
             FromJson : (string ->  {1 : p, 2 : string})}, 2 : Basis.string}
          ->  <UNIF:U1048::Type+1>))
     Differing constructor function explicitness
     Have:
     p ::: Type ->
      (p ->
        ({1 :
           {ToJson : (p ->  string),
             FromJson : (string ->  {1 : p, 2 : string})}, 2 : Basis.string}
          ->  Basis.string))
     Need:
     p :: Type ->
      (p ->
        ({1 :
           {ToJson : (p ->  string),
             FromJson : (string ->  {1 : p, 2 : string})}, 2 : Basis.string}
          ->  <UNIF:U1048::Type+1>))

I think this error message is actually pretty good! In the expression quoted, you need to change the binder of [p] to mark it as explicit, not implicit. The easy way to do that is to change [[p]] to [[p ::_]] (note no space between [::] and [_]).

_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to