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. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe