[Haskell-cafe] Programming an Evaluation Context
Claus Reinke
claus.reinke at talk21.com
Thu Feb 15 11:19:13 EST 2007
> -- evaluation contexts, parameterized by rule to apply
> ctxt rule e = rule e `mplus` left (ctxt rule) e `mplus` right (ctxt rule) e
>
> left act e = do { (Plus l r) <- return e; lv <- act l; return (Plus lv r) }
> right act e = do { (Plus lv@(Val _) r) <- return e; rv <- act r; return (Plus lv rv) }
actually, for the common case of reduction in context (contexts being preserved
unchanged), we can build contexts from context constructors corresponding to the
data constructors. moving the common plumbing into the context constructors
makes the context specification itself a lot clearer (a transliteration of the formal
specification:-):
-- context constructors
val fi e = do { Val i <- return e; return (Val (fi i)) }
plus cl cr e = do { Plus l r <- return e; l' <- cl l; r' <- cr r; return (Plus l' r') }
expr e = return e
(a .|. b) e = a e `mplus` b e
-- evaluation contexts, parameterized by rule to apply, abstract style
ctxt' hole = hole .|. plus (ctxt' hole) expr .|. plus (val id) (ctxt' hole)
Claus
More information about the Haskell-Cafe
mailing list