[Haskell-cafe] Re: Monadic bind with associated types + PHOAS?
Chung-chieh Shan
ccshan at post.harvard.edu
Wed Nov 19 13:03:40 EST 2008
Ryan Ingram <ryani.spam at gmail.com> wrote in article <2f9b2d30811190316o7d24cfccl235fafcf26d17a73 at mail.gmail.com> in gmane.comp.lang.haskell.cafe:
> I really like the syntax for do-notation. And I really like how great
> Haskell is as writing embedded languages, a lot of which comes from
> the "programmable semicolon" that monadic bind gives you.
AFAICT, standard Haskell 98 already gives you the ability to express
binding and sharing in PHOAS, except not using do-notation:
class Symantics repr where
lam :: (repr a -> repr b) -> repr (a -> b)
app :: repr (a -> b) -> repr a -> repr b
add :: repr Int -> repr Int -> repr Int
int :: Int -> repr Int
let_ :: Symantics repr => repr a -> (repr a -> repr b) -> repr b
let_ e body = app (lam body) e
testSharing :: Symantics repr => repr Int
testSharing = let_ (add (int 3) (int 4)) (\x -> add x x)
Oleg has already noted that you can nicely express the showing,
optimization (such as partial evaluation), and transformation (such as
to CPS) of embedded code in this framework. I agree with him and you
that this representation is a promising direction to explore.
All that's missing in standard Haskell 98, then, is the ability to use
do-notation:
(>>=) = let_
testSharing = do x <- add (int 3) (int 4)
add x x
But -XNoImplicitPrelude in GHC 6.10 is supposed to enable it, no?
--
Edit this signature at http://www.digitas.harvard.edu/cgi-bin/ken/sig
2008-11-20 Universal Children's Day http://unicef.org/
1948-12-10 Universal Declaration of Human Rights http://everyhumanhasrights.org
More information about the Haskell-Cafe
mailing list