私はErlangを初めて使っていて、一般的なプログラミングプログラミングには慣れていません。私のErlangプログラムの批評を探しています
私はErlangで本当に楽しい時間を過ごしています(Erlangの句読点は私が数回上がってしまったにもかかわらず);)しかし、私がフィードバックを得ることができたら、本当に大好きです より経験豊かなErlangのプログラマーのコードです。
私のコードは問題なく動作しているようですが、改善のために多くのアドバイスをいただけると確信しています。
:-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())].
第二のモジュールは、実際の問題を解決します:)ここで
は2nd Project Euler problemを解決するためのプログラムは、2つのモジュールに分割(でも素数400万以下のすべての合計を見つける。)です
-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?また、あなたのテイク関数はlist:sublist/2に似ています。誰かがこれで私を修正する可能性がありますが、私はあなたの "seqs"関数が実際には意味がないので実際には怠惰だとは思わない。ハスケルは怠惰を使用します。 Erlangには無限リストはありません。 –