Version française
Home     About     Download     Resources     Contact us    
Browse thread
Phantom types and polymorphic variants
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Daniel_Bünzli <daniel.buenzli@e...>
Subject: Phantom types and polymorphic variants
Hello,

Suppose I have the following (well-typed) definitions

> type tool = [`Spoon | `Fork]
>
> type 'a t = unit constraint 'a = [< tool]
>
> type 'a toolspec = unit constraint 'a = [< tool]
>
> let spoon : [< tool > `Spoon ] toolspec = ()
> let fork : [< tool > `Fork ] toolspec = ()
>
> let create : ([< tool ] as 'a) -> 'a t = fun t -> ()
> let create' : ([< tool ] as 'a) toolspec -> 'a t = fun t -> ()

I don't really understand why the type of the value returned by create 
and create' differ :

> # create `Spoon;;
> - : [< Test.tool > `Spoon ] Test.t = ()
> # create' spoon;;
> - : [< Test.tool ] Test.t = ()

I expected the second value to have the same type as the first.

Thanks for your explanations,

Daniel