Browse thread
Phantom types and read-only variables
- Yaron Minsky
[
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: | Phantom types and read-only variables |
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