{-# LANGUAGE TemplateHaskell #-} module Air.TH.Air where import Language.Haskell.TH import Control.Monad (replicateM) {- > $(tuple 3) [1,2,3,4,5] (1,2,3) > $(tuple 2) [1,2] (1,2) -} tuple :: Int -> ExpQ tuple n = do ns <- replicateM n (newName "x") lamE [foldr (\x y -> conP '(:) [varP x,y]) wildP ns] (tupE $ map varE ns)