{-# LANGUAGE DataKinds, TemplateHaskell #-} applicate :: Bool -> [Stmt] -> ExpQ applicate rawPatterns stmt = do return $ foldl (\g e -> VarE '(<**>) `AppE` e `AppE` g) (VarE 'pure `AppE` f') es 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)