uncurryテンプレート書いてみた。

uncurryT :: Int -> ExpQ
uncurryT n = lamE [varP f, pat] (rhs n)
  where
    f = mkName "f"
    pat = tupP (map (varP . mkName) ["x" ++ show i | i <- [1 .. n]])
    
    rhs 0 = varE f
    rhs m = appE (rhs (m-1)) (varE . mkName $ "x" ++ show m)