Erlang:是否可以将最小函数写为列表折叠?

时间:2011-03-02 13:35:39

标签: list functional-programming erlang higher-order-functions fold

给定一个功能:

min(A, B)  when A =< B -> A;
min(_A, B)             -> B.

我可以在函数foldl中以与此类似的方式使用它:

lists:foldl(fun min/2, 0, [1,2,3,4,5,6,7,8,9,10])

我认为这是不可能的,因为我必须设置一个初始值,该值将与列表的其余部分进行比较,例如: G。没有我能想到的身份功能。我是对的吗?

语法是用Erlang编写的,但对于非Erlang程序员来说也应该是可读的。

3 个答案:

答案 0 :(得分:11)

min(List) ->
    Min = fun(A,  B) when A < B -> A;
             (_A, B)            -> B end,
    lists:foldl(Min, undefined, List).

使用undefined作为初始状态应该可以解决问题。返回undefined作为空列表,这是一个很好的API。

如果您希望它在空列表中崩溃,请改为使用此函数标题:

min([Head|Rest]) ->
    Min = fun(A,  B) when A < B -> A;
             (_A, B)            -> B end,
    lists:foldl(Min, Head, Rest).

答案 1 :(得分:5)

1> List = [42,13,25,3,19,20].
[42,13,25,3,19,20]
2> lists:foldl(fun(X, Y) -> erlang:min(X,Y) end, hd(List), tl(List)).   
3

在空列表中崩溃程序,推荐的方法“让它崩溃”而不是防御性编程。

答案 2 :(得分:2)

Adam Lindbergs建议使用undefined作为初始值的缺点是它会为具有原子作为成员的列表生成奇怪的结果。 Erlang具有所有对象的全局排序,因此min函数的一个很好的属性可用于所有类型。

我认为在空列表中崩溃更合理。不同之处在于客户必须担心此案,而不必担心会导致undefined

相关问题