
With derive compiled and installed I thought I would change the code a bit and try it... ghci -fth -v0 -e '$( _derive_print_instance makeFunParser '"''"'Foo )' baz.hs baz.hs:30:3: Not in scope: `a1' Any help is appreciated! Thanks, Joel --- FunParser.hs: module FunParser where import Data.Derive import Data.Derive.Peephole import Data.List import Text.ParserCombinators.Parsec ( CharParser ) makeFunParser = Derivation drv "FunParser" drv dat@(DataDef name arity ctors) = simple_instance "FunParser" dat [funN "parse" [ sclause [] body ] ] where body = l1 "choice" $ lst [ clause con | con <- ctors ] clause con = l1 "reserved" (lit (trim (ctorName con))) >>: args con (ctorArity con) trim = reverse . takeWhile (/= '.') . reverse args ct 0 = return' (ctp ct 'a') args ct k = l1 "char" (lit '(') >>: args' ct k 0 args' ct remn seen = l0 "parse" >>=: (('a' : show seen) ->: args'' ct (remn-1) (seen+1)) args'' ct 0 seen = l1 "char" (lit ')') >>: return' (ctp ct 'a') args'' ct k seen = l1 "char" (lit ',') >>: args' ct k seen class FunParser a where parse :: CharParser s a baz.hs: import Text.ParserCombinators.Parsec hiding ( parse ) import qualified Text.ParserCombinators.Parsec.Token as T import Text.ParserCombinators.Parsec.Language( emptyDef ) import Data.Derive.TH import FunParser data NumExpr = Int Integer | Num Double instance FunParser NumExpr where parse = numExpr data Foo = Foo NumExpr lexer = T.makeTokenParser emptyDef identifier = T.identifier lexer reserved = T.reserved lexer integer = T.integer lexer float = T.float lexer numExpr :: GenParser Char a NumExpr numExpr = choice [ integer >>= return . Int , float >>= return . Num ] $( derive makeFunParser ''Foo ) -- http://wagerlabs.com/