-module(hhfuns). -compile(export_all). increment([]) -> []; increment([H|T]) -> [H+1|increment(T)]. decrement([]) -> []; decrement([H|T]) -> [H-1|decrement(T)].
具体的使用方式如下:
1> c(hhfuns). {ok, hhfuns} 2> L = [1,2,3,4,5]. [1,2,3,4,5] 3> hhfuns:increment(L). [2,3,4,5,6] 4> hhfuns:decrement(L). [0,1,2,3,4]
但是熟悉函数式编程者,肯定知道处理列表有个神器叫map/2函数。这个函数接收两个参数:第一个参数是一个函数,用来作用于列表中每一项;第二个参数是待处理的列表。map函数的一种实现方式如下:
map(_, []) -> [];
map(F, [H|T]) -> [F(H)|map(F,T)].
如果用map实现上面的功能,则需要这样:
-module(hhfuns). -compile(export_all). map(_, []) -> []; map(F, [H|T]) -> [F(H)|map(F,T)]. incr(X) -> X + 1. decr(X) -> X - 1.
然后在shell中,这样使用:
1> c(hhfuns). {ok, hhfuns} 2> L = [1,2,3,4,5]. [1,2,3,4,5] 3> hhfuns:map(fun hhfuns:incr/1, L). [2,3,4,5,6] 4> hhfuns:map(fun hhfuns:decr/1, L). [0,1,2,3,4]
这里我只是为了说明map的内部机理才给出一个实例,在实际应用中可直接使用lists:map/2函数。通过举这样一个例子你是不是已经意识到函数式编程中高阶函数的威力以及使用的方便。类似的高阶函数还有很多,我在这里例举下最常用的,以备不时之需。如下:
原文:http://www.cnblogs.com/kiven-code/p/3804635.html