[email protected]
[Top] [All Lists]

Re: [Haskell-cafe] Template Haskell - substitution in pattern in a lamb

Subject: Re: [Haskell-cafe] Template Haskell - substitution in pattern in a lambda
From: Patrick Caldon
Date: Mon, 04 Jan 2010 13:59:18 +1100
Antoine Latter wrote:
On Sun, Jan 3, 2010 at 8:30 PM, Patrick Caldon <[email protected]> wrote:
I'm trying to write some template haskell which will transform:

$(buildCP 0)  into \(SimpleM d1 d2 d3) (SimpleM _ _ _) -> (SimpleM d1 d2 d3)
$(buildCP 1)  into \(SimpleM _ d2 d3) (SimpleM d1 _ _) -> (SimpleM d1 d2 d3)
$(buildCP 1)  into \(SimpleM d1 _ d3) (SimpleM _ d2 _) -> (SimpleM d1 d2 d3)
and so on.

Ultimately I want to generalize this to more variables.

I can't seem to get anything to substitute for the pattern variables in a
lambda.  Is there a straightforward way of doing this?


It looks like you want to construct expressions with the LamE
constructor, which is declared like so:

LamE [Pat] Exp

Thanks - I see how that could work, I'll try it.

But really I was wondering if there was something like:

buildCP2 :: Int -> ExpQ
buildCP2 k =
[|\(SimpleM ~a1 ~a2 ~a3) (SimpleM ~b1 ~b2 ~b3) -> (SimpleM $e1 $e2 $e3) |]
   where (e1,a1,b1) = bitToExprs 0 k
         (e2,a2,b2) = bitToExprs 1 k
         (e3,a3,b3) = bitToExprs 2 k

bitToExprs:: Int -> Int -> (ExpQ,PatQ,PatQ)

Where ~a1 would mean "look for something called a1 returning a pattern, and slot it into the pattern part of the lambda in the appropriate spot".
I'm guessing no such syntax exists?

Thanks again,


Haskell-Cafe mailing list
[email protected]

<Prev in Thread] Current Thread [Next in Thread>