[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2007-03-12 (21:35) |
From: | Till Varoquaux <till.varoquaux@g...> |
Subject: | Re: [Caml-list] coercions issues |
Great! That was indeed really helpfull! I really missed out that last bit, I sould have payed more attention. 'a Mon.m and 'a O.m are monadic values. O.m and Mon.m are the same type. My intuition would be that they should be variant ((a :> b m) should behave like a >>= (fun x -> return (x:>b) where a is a value m a monadic type and b a supertype of a)) can anyone concur that. Cheers, Till On 3/12/07, Chris King <colanderman@gmail.com> wrote: > On 3/12/07, Till Varoquaux <till.varoquaux@gmail.com> wrote: > > This expression cannot be coerced to type > > O.o Ast.T.expr O.m = O.o Ast.T.expr Mon.m; > > it has type O.o Ast_js.T.expr Mon.m but is here used with type > > O.o Ast.T.expr O.m = O.o Ast.T.expr Mon.m > > Type > > O.o Ast_js.T.expr = > > [ `Binop of To.binop * To.expr * To.expr > > | `Cst of To.constant > > | `Ecall of To.ident * To.arg list > > | `Fun of To.ident list * To.bloc > > | `Lval of To.lvalue > > | `Unop of To.unop * To.expr ] > > is not compatible with type > > O.o Ast.T.expr = > > [ `Binop of To.binop * To.expr * To.expr > > | `Cst of To.constant > > | `Ecall of To.ident * To.arg list > > | `Epos of Ast.location * To.expr > > | `Fun of To.ident list * To.bloc > > | `Lval of To.lvalue > > | `Unop of To.unop * To.expr ] > > The first variant type does not allow tag(s) `Epos > > What sort of type is 'a O.m (or 'a Mon.m)? If it's something whose 'a > member is mutable, then such a coercion will be impossible (it would > allow you to set the member to have the `Epos tag, which it can't). > This would also happen if 'a O.m is declared as an abstract type, > since O'Caml assumes invariance by default. In the latter case, you > need to specify that 'a O.m is covariant with its parameter: > > type +'a O.m > > This tells Caml that if 'a is a subtype of 'b, then 'a O.m is indeed a > subtype of 'b O.m and you will be allowed to perform the above > coercion. > > Hope this helps. > > - Chris >