[Haskell-cafe] Monad for HOAS?
Lauri Alanko
la at iki.fi
Wed May 14 08:59:58 EDT 2008
On Wed, May 14, 2008 at 10:11:17AM +0100, Edsko de Vries wrote:
> Suppose we have some data structure that uses HOAS; typically, a DSL
> with explicit sharing. For example:
>
> > data Expr = One | Add Expr Expr | Let Expr (Expr -> Expr)
>
> When I use such a data structure, I find myself writing expressions such
> as
>
> > Let foo $ \a ->
> > Let bar $ \b ->
> > Add a b
>
> It seems to me that there should be a monad here somewhere, so that I
> can write this approximately like
>
> do a <- foo
> b <- bar
> return (Add a b)
Neat idea, but the monad can't work exactly as you propose, because
it'd break the monad laws: do { a <- foo; return a } should be equal
to foo, but in your example it'd result in Let foo id.
However, with an explicit binding marker the continuation monad does
what you want:
import Control.Monad.Cont
data Expr = One | Add Expr Expr | Let Expr (Expr -> Expr)
type ExprM = Cont Expr
bind :: Expr -> ExprM Expr
bind e = Cont (Let e)
runExprM :: ExprM Expr -> Expr
runExprM e = runCont e id
Now you'd write your example as
do a <- bind foo
b <- bind bar
return (Add a b)
HTH.
Lauri
More information about the Haskell-Cafe
mailing list