[Haskell-cafe] Re: Can this be done?
wren ng thornton
wren at freegeek.org
Sun Feb 15 00:29:20 EST 2009
Chung-chieh Shan wrote:
> wren ng thornton wrote:
> > It's ugly, but one option is to just reify your continuations as an ADT,
> > where there are constructors for each function and fields for each
> > variable that needs closing over. Serializing that ADT should be simple
> > (unless some of those functions are higher-order in which case you run
> > into the same problem of how to serialize the function arguments). In
> > GHC's STG machine this representation shouldn't have much overhead,
> > though it does require the developer to do the compiler's job.
> FWIW, this idea is called defunctionalization (due to Reynolds),
> and it works for higher-order functions as well (because you can
> defunctionalize those function arguments in the same way).
Oh certainly. Depending on how the HOFs are used, however, that can lead
to a very large grammar. The basic ADT approach works best when there
are a small selection of actions to take or pass around (aka few states
in the state machine).
For a more general solution you'll want to use something like HOAS or
Template Haskell's AST, with explicit representations for general
function application, let binding, and case expressions. That way the
building blocks are small enough to keep the evaluator simple to maintain.
More information about the Haskell-Cafe