変換できますか
-- tupleUnfold :: forall a. ((forall b. a -> b)) -> a -> ((b))
tupleUnfold :: Int -> ExpQ
tupleUnfold n = do
xs <- forM [1 .. n] (const . newName $ "x")
y <- newName "y"
let y' = varE y
g (ps', es') x = (varP x : ps', appE (varE x) y' : es')
(ps, es) = foldl' g ([], []) xs
lamE [tupP ps, varP y] (tupE es)
明快さを維持しながらポイントフリースタイルにする(私はプログラム「ポイントフリー」を知っていますが、コードをさらに難読化したくない)?
いずれにせよ、関数のスタイルを改善するために、またはその意図をより明確にするために、どのような変更を加えることができますか?この機能は、以下のように使用することを目的としています。
$(tupleUnfold 3) ((+ 1), (+ 2), (+ 3)) 2
-- (3, 4, 5)
使用するのに適した命名規則は何ですか(ps、ps'、es、およびes'変数を参照)。