[Haskell] ST vs State
David Menendez
zednenem at psualum.com
Thu May 31 01:29:37 EDT 2007
David Menendez writes:
> It's also possible to write ST in terms of State.
>
> Assume we have a Store ADT with this interface:
>
> data Store r
> data STRef r a
> withStore :: (forall r. Store r -> a) -> a
> newRef :: a -> Store r -> (STRef r a, Store r)
> readRef :: STRef r a -> Store r -> a
> writeRef :: STRef r a -> a -> Store r -> Store r
>
> (The 'r' parameter is to make sure that references are only used with
> the Store that created them. The signature of withStore effectively
> gives every Store a unique value for r.)
Rats. The rank-2 type isn't enough to guarantee type-safety. You need a
monad (or linear types) to make sure that the Store is used
single-threadedly.
Using the API above, you can defeat the type checker.
coerce :: a -> b
coerce a = withStore (\s0 ->
let (r1,s1) = newRef a s0
(r2,s2) = newRef undefined s0
in readRef r2 s1)
(Of course, you would have needed a function like coerce to implement
the API in the first place.)
--
David Menendez <zednenem at psualum.com> | "In this house, we obey the laws
<http://www.eyrie.org/~zednenem> | of thermodynamics!"
More information about the Haskell
mailing list