[Haskell-cafe] Modelling a mutable variable store

Derek Elkins derek.a.elkins at gmail.com
Sat Dec 1 22:22:53 EST 2007


On Sun, 2007-12-02 at 03:11 +0000, Kannan Goundan wrote:
> I'm implementing an interpreter for the lambda calculus augmented with 
> mutable variables.  I'm having problems doing the mutable state stuff in 
> Haskell.  Here's what I have so far:
> 
>   type Expr    = ... terms in the language ...
>   type Value   = ... values in the language ...
>   type Ident   = String
>   type VarId   = String
> 
>   type Env = Map Ident Target
>   data Target = TValue Value | TVar VarId
>     -- idents might refer to values or vars in the store.
> 
>   type Store = Map VarId (Maybe Value)
>     -- Using "Maybe" because vars start out uninitialized.
> 
>   eval :: (Env, Store, Expr) -> (Store, Value)
>     -- The Store is threaded through the evaluator.
> 
> One problem is that the link between an identifier and it's entry in the 
> store is via VarIds, which are just strings.  For example, if I see the 
> identifier "x", I first look it up in the Env, and if it is a "TVar", I 
> then look it up in the store.  I'd like to get something stronger (in 
> Java, I would use a pointer).  
> 
> Another problem is that entries in my Store never get garbage collected.  
> Again, if I were using pointers in Java, this wouldn't be an issue.
> 
> There's also the issue of finding a more elegant way of threading the 
> Store through my evaluator, but I'm not concerned too much about that at 
> this point.  I can probably define a state-carrying monad like Parsec.  
> My real concerns are the first two issues.

Use ST.  First-class state isn't too great unless you specifically want
that.



More information about the Haskell-Cafe mailing list