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