
On Mon, Mar 16, 2009 at 8:08 PM, Michael Vanier
Ryan,
So, if I understand you correctly, my only option is to use an IORef instead of an STRef? What I'm trying to do is implement a mutable box type as part of a dynamically-typed language I'm implementing in Haskell (which is mainly an exercise to improve my Haskell programming; mission accomplished). It bothers me that I have to use an IORef for this, since I don't see what this has to do with I/O. Similarly, if I wanted to have a mutable array type, I couldn't use STArray; I'd have to use IOArray. Or, I suppose I could define a richer Value type that had extra constructors for stateful types.
Why not: data Value = forall a . Typeable a => V a type STValue s = STRef Value Then you have a dynamic, mutable box. Also, even if the language you're interpretting is dynamicaly typed, it doesn't mean that you need to use Haskell Dynamics. It should be enough to do something like: data Value = VInt Integer | VStr String | VChar Char and then: -- | Similar to Prelude.Head primOpHead :: Value -> Value primOpHead (VStr xs) = VChar $ head xs primOpHead _ = error "Type Mismatch!" I'm sure other people can point you to much better ways to do this - the point is that you don't need Dynamics to implement a dynamic language. Antoine