Browse thread
Phantom types and read-only variables
-
Yaron Minsky
- Yaron Minsky
- Remi Vanicat
- Markus Mottl
[
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: | 2005-02-05 (18:34) |
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.