[Haskell-cafe] monadic DSL for compile-time parser generator, not possible?

Jeremy Shaw jeremy at n-heptane.com
Tue Mar 12 21:51:11 CET 2013


On Tue, Mar 12, 2013 at 3:32 PM, Jacques Carette <carette at mcmaster.ca> wrote:
> On 13-03-12 04:06 PM, Jeremy Shaw wrote:

>>> data ParserSpec a where
>>>      AnyChar :: ParserSpec Char
>>>      Return  :: a -> ParserSpec a
>>>      Join    :: ParserSpec (ParserSpec a) -> ParserSpec a
>>>      FMap    :: (a -> b) -> ParserSpec a -> ParserSpec b
>
>
> does not work.  The flaw is indeed in FMap.  It should not take a function
> as first argument, but rather a *description* of a function (the same way
> ParserSpec gives you a description of a parser).  Then you can make it work,
> if your 'description' language is adequate.

Right. But, then I would not be able to use Haskell's existing do
notation -- and I would have to poorly recreate a subset of Haskell.
And, I think, ParsecSpec would not be a real monad. But.. that is sort
of the conclusion -- if you want to do compile-time generation, then
the data-type can not contain any function values -- at least none
that would need to be lifted into the generated code. And, there is no
way to make a type with a real Monad instance which does not contain
such a function.



More information about the Haskell-Cafe mailing list