Erlangでいろいろ

30分プログラム、その118。Erlangの勉強を始めたので、車輪の再発明をいくつか。
絶対にlistsモジュールにもうあるんだろうなぁ。

ソースコード

-module(newbies).
-compile(export_all).

last([X])-> X;
last([_|T]) -> last(T).

foldr(_,Init,[]) -> Init;
foldr(F,Init,[H|T]) -> F(H,foldr(F,Init,T)).

foldl(_,Init,[]) -> Init;
foldl(F,Init,[H|T]) -> foldl(F,F(Init,H),T).

map(F,XS) -> foldr(fun(X,Y)-> [F(X)|Y] end,[],XS).
length(XS) -> foldl(fun(X,_) -> X + 1 end,0,XS).
filter(P,XS) -> foldr(fun(X,Y)-> case P(X) of
				     true -> [X|Y];
				     false -> Y
				 end
		      end,[],XS).

delete(X,[X|T])-> T;
delete(X,[H|T]) -> [H|delete(X,T)].


merge(L,[]) -> L;
merge([],L) -> L;
merge([X|XS],[Y|YS]) -> [X,Y|merge(XS,YS)].

forall(_,[]) -> true;
forall(P,[H|T]) -> P(H) andalso forall(P,T).

exists(_,[]) -> false;
exists(P,[H|T]) -> P(H) orelse exists(P,T).

fact(0) -> 1;
fact(N) -> N*fact(N-1).