{- Beispielfunktionen mit newName und mkName -} import Language.Haskell.TH -- allgemeine Projektion von n-Tupel auf i-te Komponente sel1 :: Int -> Int -> Q Exp sel1 i n = do x <- newName "a" {- let wilds = replicate n WildP return (LamE [TupP (replaceAt (i-1) wilds (VarP x))] (VarE x)) -} let wilds = replicate n wildP lamE [tupP (replaceAt (i-1) wilds (varP x))] (varE x) replaceAt :: Int -> [a] -> a -> [a] replaceAt n xs x = take n xs ++ x:drop (n+1) xs sel2 :: Int -> Int -> Q Exp sel2 i n = lamE [pat] rhs where pat = tupP (map (varP.mkName) as) rhs = varE $ mkName (as !! (i - 1)) as = [ "a" ++ show j | j <- [1..n] ] -- Erzeugung eines n-Tupels aus einer Liste tuple :: Int -> ExpQ tuple n = [|\list -> $(tupE (exprs [|list|])) |] where exprs list = [infixE (Just (list)) (varE (mkName "!!")) (Just (litE $ integerL (toInteger num))) | num <- [0..(n - 1)]]