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

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Remi Vanicat <remi.vanicat@g...>
Subject: Re: [Caml-list] Phantom types and read-only variables
On Sat, 5 Feb 2005 11:50:43 -0500, Yaron Minsky <yminsky@gmail.com> wrote:
> I'm trying to use phantom types to build a "freezable" variable, where
> I can create a version of the variable to which write operations can
> not be applied.  Here's my first attempt, which was rejected by the
> compiler:
> 
> type ro = Readonly
> type rw = Readwrite
> 
> module M =
> struct
>   type 'a t = { mutable value: int }
> 
>   let create i = { value = i }
>   let freeze t = t
>   let read x = x.value
>   let write x i =
>     x.value <- i
> end
> 
> module N =
>   (M : sig
>      type 'a t
>      val create : int -> rw t
>      val freeze : 'a t -> ro t
>      val read : 'a t -> int
>      val write : rw t -> int -> unit
>    end)
> 
> I do basically understand why the compiler rejects module N.  It
> basically complains that the freeze in M is not compatible with the
> constraints on N.  In particular:
> 
> Values do not match:
>   val freeze : 'a -> 'a
> is not included in
>   val freeze : 'a t -> ro t
> 
> So, what's the right approach here?

Ocaml don't do any automatic type conversion, you have to explicitly coerce :
let freeze t = (t :> ro t)

will do what you want.