Вы можете конвертироватьPoint-свободной форме в зависимости от стиля
-- 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)
Какие лучше именования для использования (см пс, пс, эс, Е. С. переменные)?
Мне нравится использование «replicateM» - не знаю, как я пропустил этот – ScootyPuff
Я отмечаю это как правильный ответ несколько произвольно. Несмотря на то, что другой на уровне верхнего уровня не имеет смысла, этот, по-видимому, лучше отражает поток и трансформацию, хотя его немного труднее читать. – ScootyPuff
Отчасти причиной складки (вместо карты) было избежать множественных обходов. Я также знаю, что GHC довольно хорош в обходах списка сплайсинга. Это обычно значительная разница? Учитывая, что обе формы относительно легко писать, что должно (как правило,) быть предпочтительным? – ScootyPuff