
Ryan Ingram
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