Alain Cremieux wrote:
Hi,
I'm trying to code the exemples of "Template Meta-Programming" for Haskell. Since there are differences in the implementation, I'm obliged to understand what I code, which is a good exercise.
At present I'm stuck in the mkZip function, because I'm unable to create a pattern which is a list concatenation of 2 patterns. For expressions I can use 'listExp', but what is the equivalent for patterns ?
I've been trying to get your program to work for a little bit as well and I'm not having much luck either. Firstly, if we defined pcons x xs = [p| $x : $xs |] as per the Template Haskell paper we get the error message MkZip.hs:23: Parse error in pattern I tried to be a little more tricky. I printed out the reified data structure for d = [d| f (x:xs) = x:xs |] And found that the pattern was Pcon "GHC.Base::" [Pvar "x'0", Pvar "xs'0"] So I tried to defined pcons as pcons x xs = Pcons "GHC.Base::" [x,xs] but now I get the error message tcLookup: `GHC.Base.:' is not in scope I think the problem may be that cons (:) is built in syntax in Haskell and hence doesn't have a definition anywhere. Am I right? It could well be that this problem you're experiencing has no solution at the moment. I've tried everything I could think of. Just to let you know there is a small mistake in your program as it stands b = listExp [tup eXs, apps (name: eXSs) ] will produce the code (say for zip3) "[ (x1,x2,x3), zip3 xs1 xs2 xs3 ]" which is not quite what you want. What you want is: "(x1,x2,x3) : zip3 xs1 xs2 xs3" The original definition b = [| $(tup eXs) : $(apps (name : eXSs)) |] will work fine though. Sean