se puede convertirforma libre puntos frente estilo
-- 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)
a pointfree estilo a la vez que mantiene la claridad (sé de la 'pointfree' programa, pero preferiría no ofuscar el código aún más)?
De cualquier manera, ¿qué cambios se pueden hacer para mejorar el estilo de la función, o de lo contrario hace que su intención sea más clara? La función está destinada a ser utilizada de la siguiente manera.
$(tupleUnfold 3) ((+ 1), (+ 2), (+ 3)) 2
-- (3, 4, 5)
¿Cuáles son algunas de las convenciones de nomenclatura para utilizar mejor (véase el PS, PS', ES, y es' variables)?
Me gusta el uso de "replicateM" - no estoy seguro de cómo me olvidé de ese – ScootyPuff
Estoy marcando este como la respuesta correcta de forma un tanto arbitraria. Aunque el otro es sin puntos en el nivel superior, este parece representar mejor el flujo y la transformación, aunque es un poco más difícil de leer. – ScootyPuff
Parte de la razón para el doblez (en lugar del mapa) era evitar múltiples recorridos. También sé que GHC es bastante bueno en la fusión de listas cruzadas. ¿Es usualmente una diferencia significativa? Dado que ambas formas son relativamente fáciles de escribir, ¿cuál debería (como regla general) preferir? – ScootyPuff