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: | -- (:) |
| From: | Yaron Minsky <yminsky@g...> |
| Subject: | Re: Phantom types and read-only variables |
One addendum. this can clearly be done with Obj.magic, but I'm
wondering if there's any safe alternative.
y
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?
>
> y
>