Ja osobiście wolę rekursję niż spasować w Erlang (w przeciwieństwie do innych języków, np. Haskell). Nie widzę, aby fałd był bardziej czytelny niż rekursja. Na przykład:
fsum(L) -> lists:foldl(fun(X,S) -> S+X end, 0, L).
lub
fsum(L) ->
F = fun(X,S) -> S+X end,
lists:foldl(F, 0, L).
vs
rsum(L) -> rsum(L, 0).
rsum([], S) -> S;
rsum([H|T], S) -> rsum(T, H+S).
wydaje się kod, ale to jest dość proste i idiomatyczne Erlang. Używanie spasowania wymaga mniej kodu, ale różnica staje się mniejsza i mniejsza przy większej ładowności. Wyobraźmy sobie, że chcemy filtra i mapujemy wartości nieparzyste na ich kwadrat.
lcfoo(L) -> [ X*X || X<-L, X band 1 =:= 1].
fmfoo(L) ->
lists:map(fun(X) -> X*X end,
lists:filter(fun(X) when X band 1 =:= 1 -> true; (_) -> false end, L)).
ffoo(L) -> lists:foldr(
fun(X, A) when X band 1 =:= 1 -> [X|A];
(_, A) -> A end,
[], L).
rfoo([]) -> [];
rfoo([H|T]) when H band 1 =:= 1 -> [H*H | rfoo(T)];
rfoo([_|T]) -> rfoo(T).
Oto lista wygrywa ze zrozumieniem, ale funkcja rekurencyjna jest na drugim miejscu i złożyć wersja jest brzydkie i mniej czytelny.
I na koniec nie jest prawdą, że fold jest szybszy niż wersja rekursywna, zwłaszcza gdy jest skompilowany do natywnego kodu (HiPE).
Edit: dodaję krotny wersję z zabawy w zmiennej zgodnie z żądaniem:
ffoo2(L) ->
F = fun(X, A) when X band 1 =:= 1 -> [X|A];
(_, A) -> A
end,
lists:foldr(F, [], L).
nie widzę jak to jest bardziej czytelny niż rfoo/1
i znalazłem szczególnie manipulacja bardziej skomplikowane i akumulatorów mniej oczywiste niż bezpośrednia rekursja. Jest to nawet dłuższy kod.
Nie zapomnij o 'list: zf/2'. To filtr mapy w jednym. Zf możesz zrobić 'list: zf (zabawa (X), gdy X zakres 1 =: = 1 -> {prawda, X * X}; (_) -> fałszywy koniec, L)'. Niestety zf nie jest udokumentowany, więc oficjalnie nie istnieje ... –
Ładne porównanie różnych metod! Myślę, że fałda jest bardziej czytelna w twoim pierwszym przykładzie, ale różnica jest oczywiście całkiem mała przy tak prostej funkcji. W twoim drugim przykładzie, faktycznie uważam, że fmfoo jest bardziej czytelny niż rfoo, ale oczywiście zrozumienie listy wygrywa w tym czasie. Wszystko to pokazuje, że to naprawdę zależy od programisty, aby wybrać odpowiednie narzędzie do pracy za każdym razem :-) –
Doskonała odpowiedź z +1. – Gilles