Zawsze pisałam lista produkujących funkcji rekurencyjnych w tym formacie:Haskell Lista Łączenie vs (głowa tail) format
recursiveFunc :: [a] -> [b]
recursiveFunc (x:xs) = [change x] ++ resursiveFunc xs where
change :: a -> b
change x = ...
Zdaję sobie sprawę dowolnej funkcji jak wyżej może być napisany w przypadku a -> b
a następnie po prostu map
ed przez zestaw [a]
, ale proszę wziąć tę sytuację rozwodnioną jako przykład.
HLint sugeruje zastąpienie [change x] ++ recursiveFunc xs
z change x : recursiveFunc xs
.
Czy ta sugestia jest czysto estetyczna, czy ma jakiś wpływ na to, w jaki sposób Haskell wykonuje tę funkcję?
Cóż, z pierwszym argumentem pojedynczego elementu, '++' * będzie * po prostu 'cons' raz, a następnie zakończy działanie, ale jest to bardzo okrężny sposób na dodanie pojedynczej wartości. – delnan
Twoja wersja ma tę zaletę, że jeśli w jakimś momencie zdecydujesz się zmodyfikować swoją funkcję w taki sposób, że do listy zostanie dodany więcej niż jeden element, będzie mniej do zmiany. –
Propozycje hlint nie zmieniają wyniku wyrażenia. –