można przekonwertowaćPunkt wolna forma kontra stylu
-- 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)
do pointfree styl przy zachowaniu jasności (wiem programu „pointfree”, ale wolałby, aby nie zaciemniać kodu nawet więcej)?
Tak czy inaczej, jakie zmiany można wprowadzić, aby poprawić styl funkcji, lub w inny sposób czynią ją bardziej zrozumiałą? Funkcja jest przeznaczona do użycia jak poniżej.
$(tupleUnfold 3) ((+ 1), (+ 2), (+ 3)) 2
-- (3, 4, 5)
Jakie są lepsze konwencje nazewnictwa (zobacz zmienne ps, ps ', es i es)?
Podoba mi się użycie "replicateM" - nie wiem, jak bardzo tęskniłem za tym – ScootyPuff
Zaznaczam to jako poprawną odpowiedź nieco arbitralnie. Chociaż ten drugi jest bezsporny na najwyższym poziomie, ten wydaje się lepiej reprezentować przepływ i transformację - choć nieco trudniej go odczytać. – ScootyPuff
Jednym z powodów spasowania (zamiast mapy) było uniknięcie wielokrotnych przejazdów. Wiem też, że GHC jest raczej dobry w przepuszczaniu list. Czy to zwykle znacząca różnica? Biorąc pod uwagę, że obie formy są stosunkowo łatwe do napisania, co powinno być (z reguły korzystne)? – ScootyPuff