Pattern variables in Template Haskell

Dear Haskell-cafe, I'm trying to use Template Haskell to generate patterns in Haskell code, but after a couple of days of trying, I have not come with a solution. I hope somebody could help me. My problem is basically that I want something like: example :: Maybe a -> a example $(j "x") = x to work correctly. The idea of this simple quoter is to generate code similar to: example :: Maybe a -> a example (Just x_123) = x_123 that is, to create the "Just" pattern, and to make "x" bind to the same element. Right now my code reads: j :: String -> Q Pat j s = return (ConP 'Just [VarP (mkName s)]) which generated a new variable "x" each time, thus unable to match with the "x" in the RHS. I have also tried with lookupValueName. Note that my problem is a bit more complicated, with variable names coming from a different source. However, I think that if I solve this problem where I can make variables in a pattern and in an expression match, I should be able to use them in my complete solution. Thanks in advance.

I just tried
foo $( [p| x |] ) = x
and got that x is unbound on the RHS. This may be a GHC bug if no one here knows how this is supposed to work. I sure don't, but I've never explored pattern splices.
Richard
On Nov 3, 2014, at 3:07 AM, Alejandro Serrano Mena
Dear Haskell-cafe, I'm trying to use Template Haskell to generate patterns in Haskell code, but after a couple of days of trying, I have not come with a solution. I hope somebody could help me.
My problem is basically that I want something like:
example :: Maybe a -> a example $(j "x") = x
to work correctly. The idea of this simple quoter is to generate code similar to:
example :: Maybe a -> a example (Just x_123) = x_123
that is, to create the "Just" pattern, and to make "x" bind to the same element. Right now my code reads:
j :: String -> Q Pat j s = return (ConP 'Just [VarP (mkName s)])
which generated a new variable "x" each time, thus unable to match with the "x" in the RHS. I have also tried with lookupValueName.
Note that my problem is a bit more complicated, with variable names coming from a different source. However, I think that if I solve this problem where I can make variables in a pattern and in an expression match, I should be able to use them in my complete solution.
Thanks in advance. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

I found some old docs saying that pattern splices are not completely
implemented due to this problem with binding.
At the end, I used quasi-quotation + haskell-src-exts to achieve the same
results. In this case, it seemed to work because quasi-quoters are run
before the renamer, instead of after it.
In any case, thanks very much for your help :)
2014-11-03 15:53 GMT+01:00 Richard Eisenberg
I just tried
foo $( [p| x |] ) = x
and got that x is unbound on the RHS. This may be a GHC bug if no one here knows how this is supposed to work. I sure don't, but I've never explored pattern splices.
Richard
On Nov 3, 2014, at 3:07 AM, Alejandro Serrano Mena
wrote: Dear Haskell-cafe, I'm trying to use Template Haskell to generate patterns in Haskell code, but after a couple of days of trying, I have not come with a solution. I hope somebody could help me.
My problem is basically that I want something like:
example :: Maybe a -> a example $(j "x") = x
to work correctly. The idea of this simple quoter is to generate code similar to:
example :: Maybe a -> a example (Just x_123) = x_123
that is, to create the "Just" pattern, and to make "x" bind to the same element. Right now my code reads:
j :: String -> Q Pat j s = return (ConP 'Just [VarP (mkName s)])
which generated a new variable "x" each time, thus unable to match with the "x" in the RHS. I have also tried with lookupValueName.
Note that my problem is a bit more complicated, with variable names coming from a different source. However, I think that if I solve this problem where I can make variables in a pattern and in an expression match, I should be able to use them in my complete solution.
Thanks in advance. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (2)
-
Alejandro Serrano Mena
-
Richard Eisenberg