Я новичок в Erlang и довольно новичок в функциональном программировании в целом.Ищете критику моей программы Erlang
У меня было очень хорошее время с Эрланом (хотя пунктуация Эрланга заставила меня побывать несколько раз;)), но мне очень понравилось бы, если бы я мог получить некоторую обратную связь на my кода от более опытных программистов Erlang.
Мой код, похоже, работает нормально, но я уверен, что вы, ребята, могли бы предложить много советов для улучшения! :)
Вот программа для решения 2nd Project Euler problem (найти сумму всех четных простых чисел ниже четырех миллионов), разделить на два модуля:
-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» действительно ленивы в том смысле, что, например, Хаскелл использует лень. Например, у Erlang нет бесконечных списков. –