[Haskell-cafe] I want to write a compiler

wren ng thornton wren at freegeek.org
Sat Mar 7 23:07:24 EST 2009


Loup Vaillant wrote:
> -> support algebraic data types and case expressions (unless I can get
> away with encoding them as functions),

Which you always can,

     data Foo = A a1...an | B b1...bn |...

==

     type Foo :: forall r.
                 (a1->...->an -> r) ->
                 (b1->...->bn -> r) ->...
                 -> r

     A a1...an = \fa _... -> fa a1...an

     B b1...bn = \_ fb... -> fb b1...bn

     ...


The only trick is that you need to have closures (in order to build the 
Foos) and you need to have first-class functions (in order to pass the 
destructors in). If you're familiar with the STG machine, this is what 
they do under the covers anyways. At the core level, all you need is 
some primitive to force evaluation.

(Church Encoding)++

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list