← All posts tagged Erlang

Shchvova

чем дальше синтаксис учу тем больше Эрланг кажется каким-то тяп-ляп Хаскелем. Ну или Хаскелисты прямо очень любили Эрланг. Вообще синтаксис Хаскеля кажется существенно стройнее, как буд-то прошло джвадцать лет и они поняли что не нужны все эти ссаные знаки припинания. Я вполне понимаю что вся годнота Эрланка не в синтаксисе а в процессах/конкаранси/месаджах, но я туда еще не дошел.

Shchvova

так вот. В эрланге принято писать функции так что бы компиляр применял оптимизацию хвостовой рекурсии. Например, функция zipwith/3, получает функцию и два списка на склейку. Вместо того что бы написать

zipwith(_, [], _) -> [];
zipwith(_, _, []) -> [];
zipwith(Pred, [X | Rest1], [Y | Rest2]) -> [ Pred(X, Y) | zipwith(Pred, Rest1, Rest2) ].

будет писать что-то вроде такого:

zipwith(Pred, List1, List2) -> zipwith(Pred, List1, List2, []).

zipwith(_Pred, [], _, Acc) -> task_2:reverse(Acc);
zipwith(_Pred, _, [], Acc) -> task_2:reverse(Acc);
zipwith(Pred, [H1|T1], [H2|T2], Acc) -> zipwith(Pred, T1, T2, [Pred(H1, H2) | Acc]).

А в Haskell так принято делать?