% $Id: higherorder.erl,v 1.1 2013/04/24 02:06:23 leavens Exp leavens $ %% Some examples of higher order functions %% AUTHOR: Gene Sher and Gary Leavens -module(higherorder). -export([foreach/2, foldr/3, map/2, applyList/2, applyList2/2, member/2, foldl/3, reverse/1, minimum/1]). % Foreach is like map, but is used for effects, not for values. % This is like the foreach in Erlang's lists module foreach(_P, [])-> ok; foreach(P, [Elem|Tail])-> P(Elem), foreach(P, Tail). % Foldr is an abstraction of full recursion on lists. % Foldr is like in Haskell, and in Erlang's lists module foldr(_Op, Z, []) -> Z; foldr(Op, Z, [Y|Ys]) -> Op(Y, foldr(Op,Z,Ys)). % Some uses of foldr are below: % Map is as in Haskell and in Erlang's lists module. map(F,Es) -> foldr(fun(E,Res) -> [F(E)|Res] end, [], Es). %% Apply a list of functions to an argument applyList(FS,X) -> map(fun (F) -> F(X) end, FS). %% the same, but using a list comprehension applyList2(FS, X) -> [F(X) || F <- FS]. % Member is as in Erlang's lists module. member(Elem, Lst) -> foldr(fun(X,Res) -> (Elem == X) or Res end, false, Lst). % Foldl is an abstraction of tail recursion on lists. % Foldl is like as in Erlang's lists module. % A difference from Haskell is the order of the arguments passed to F. foldl(_F, Acc, []) -> Acc; foldl(F, Acc, [Y|Ys]) -> foldl(F, F(Y,Acc), Ys). % Reverse is like lists:reverse in Erlang. reverse(Ys) -> foldl(fun (Y,Acc) -> [Y|Acc] end, [], Ys). % Minimum is like lists:min in Erlang. % This implmentation assumes the argument is not empty. minimum([Y|Ys]) -> foldl(fun (E,Acc) -> min(E,Acc) end, Y, Ys).