Можете ли вы преобразовать
-- 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)
в стиль pointfree, сохраняя ясность (я знаю о программе 'pointfree', но предпочел бы не запутывать код еще больше)?
ЛибоКстати, какие изменения можно было бы внести, чтобы улучшить стиль функции, или иным образом прояснить ее намерения?Функция предназначена для использования, как показано ниже.
$(tupleUnfold 3) ((+ 1), (+ 2), (+ 3)) 2
-- (3, 4, 5)
Какие лучше использовать соглашения об именах (см. Переменные ps, ps ', es и es')?