我是新來的Erlang和相當新的函數式編程一般。尋找我的二郎綱領批判
我一直在使用Erlang一個很好的時間,到目前爲止(即使Erlang的標點符號有過我絆倒了幾次;)),但我真的很喜歡它,如果我能得到 一些反饋我來自更有經驗的Erlang程序員的代碼。
我的代碼似乎好了工作,但我敢肯定,你們能提供很多建議的改進! :)
下面就來解決2nd Project Euler problem(找到所有偶數素數低於400萬的總和),分成兩個模塊的程序:
-module(seqs).
-export([takewhile/2, take/2]).
%% Recursively pick elements from a lazy sequence while Pred(H) is true
takewhile(Pred, [H|T]) ->
case Pred(H) of
true -> [H|takewhile(Pred, T())];
false -> []
end.
%% Take a certain number of elements from a lazy sequence
%% A non-tail recursive version
take(0, _) -> [];
take(Number, [H|T]) ->
[H|take(Number - 1, T())].
第二個模塊解決了實際的問題:
-module(euler002).
-import(seqs, [takewhile/2]).
-export([lazyfib/0, solve/0]).
%% Sums the numbers in a list (for practice's sake)
sum([]) -> 0;
sum([H|T]) -> H + sum(T).
%% Practicing some list comprehensions as well!
filter(P, Xs) -> [ X || X <- Xs, P(X) ].
%% Lazy sequence that generates fibonacci numbers
lazyfib(A, B) -> [A | fun() -> lazyfib(B, A + B) end].
lazyfib() -> lazyfib(0, 1).
%% Generate all fibonacci terms that are less than 4 million and sum the
%% even terms
solve() ->
Fibs = seqs:takewhile(fun (X) -> X < 4000000 end, lazyfib()),
sum(filter(fun (X) -> X rem 2 =:= 0 end, Fibs)).
在此先感謝,並請告訴我,這是不是這種問題的合適論壇! :)
是您takewhile功能真正從名單有什麼不同:takewhile/2?你的函數看起來也和列表類似:sublist/2。有人可能會糾正我,但我不認爲你的「seqs」函數真的很懶, Haskell使用懶惰。例如Erlang沒有無限列表。 – 2011-03-31 11:33:35