On Thu, Apr 05, 2007 at 02:47:21PM +0100, Joel Reymont wrote: > Here's the output from -ddump-splices (thanks Saizan for the tip). > > It's returning a1 instead of a0. > > ghci -fth -e '$( _derive_print_instance makeFunParser '"''"'Foo )' > baz.hs -ddump-splices > baz.hs:1:0: > baz.hs:1:0: Splicing declarations > derive makeFunParser 'Foo > ======> > baz.hs:30:3-28 > instance {FunParser Main.Foo} where > [] > { parse = choice > [(>>) > (reserved ['F', 'o', 'o']) > ((>>) > (char '(') ((>>=) parse (\ a0 -> (>>) > (char ')') (return (Main.Foo a1)))))] } > > baz.hs:30:3: Not in scope: `a1'
Sorry for the late multiple reply, I just spent seven hours sleeping... I am not the maintainer of Data.Derive, nor did I write the majority of the nice code; Neil Mitchell did it, you can ask him "why replace DrIFT". However, using abstract syntax trees WAS my idea. First, _derive_print_instance will never give you a TH splice error, since it always evaluates to an empty list of declarations. It uses the TH 'runIO' facility such that type-checking a file using _derive_print_instance will emit the instances to standard output as a side effect. So the error is coming from the $(derive) in baz.hs, if you have more errors try commenting it out. (you'll get bogus code on stdout, but at least it will be completly haskell!) _derive_print_instance was not intended to be a debugging aid, although it certainly works well in that capacity. The intent is that it will be used when the standalone driver is rewritten to use TH, which I intend to do not long after I can (Neil is out of communication for a week with intent to continue hacking Derive; I'm taking this as a repository lock). Yes, we do use type classes to implement recursion across types. This seems to be a very standard idiom in Haskell, used by Show, Read, Eq, Ord, NFData, Arbitrary, and doubtless many more. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe