5

给定一个函数:

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])

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

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

4

3 回答 3

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).
于 2011-03-02T13:43:38.017 回答
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

使空列表上的程序崩溃,这是一种推荐的方法“让它崩溃”,而不是防御性编程。

于 2011-03-02T13:46:07.007 回答
2

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

我认为在空列表上崩溃更合理。不同之处在于,客户必须担心这种情况,而不是担心得到 aundefined作为结果。

于 2011-03-04T15:20:59.607 回答