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

List Erlang:是否可以将最小函数写为列表折叠?,list,functional-programming,erlang,higher-order-functions,fold,List,Functional Programming,Erlang,Higher Order Functions,Fold,给定一个函数: min(A, B) when A =< B -> A; min(_A, B) -> B. 我认为这是不可能的,因为我必须设置一个初始值,该值将与列表的其余部分进行比较,例如。G没有我能想到的身份函数。我说得对吗 语法是用Erlang编写的,但对于非Erlang程序员也应该是可读的 min(List) -> Min = fun(A, B) when A < B -> A; (_A,

给定一个函数:

min(A, B)  when A =< B -> A;
min(_A, B)             -> B.
我认为这是不可能的,因为我必须设置一个初始值,该值将与列表的其余部分进行比较,例如。G没有我能想到的身份函数。我说得对吗

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

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

使空列表上的程序崩溃,这是一种建议的方法“让它崩溃”,与防御性编程相反。

亚当·林德伯格(Adam Lindbergs)建议使用
未定义的
作为初始值,缺点是它会为包含原子的列表生成奇怪的结果。Erlang对所有对象都有全局排序,因此min函数的一个很好的特性是可以用于所有类型


我认为空名单更合理。不同之处在于,客户必须担心这个案例,而不是担心结果是
未定义的

你不能用
head
作为初始值吗?我想我可以,这会在下面指出的空列表中崩溃。Yasir和Adam的答案都很好,根据上下文的不同,在空列表上崩溃是可以接受的,也不能接受。顺便说一句,修复了您的示例,因此可以编译它。谢谢,@Peer。此外,我认为
未定义的
没有太多意义,例如,参见。@Yasir。我同意。回答得好!看起来第一个保护(未定义,B)->B是多余的。实际上,只是出于随机性,它不会崩溃。我不知道结果是否是确定的,但在我尝试过的例子中,任何数字和原子的比较都会返回较小的数字。传递
未定义的
有效,因为
Oops有一个定义良好的顺序,
foldl
的最后一个参数应该是
tl(List)
(List尾部)。我希望我们有Haskell中的函数
foldl1
,这样我们就不用初始值了。
min(List) ->
    Min = fun(A,  B) when A < B -> A;
             (_A, B)            -> B end,
    lists:foldl(Min, undefined, List).
min([Head|Rest]) ->
    Min = fun(A,  B) when A < B -> A;
             (_A, B)            -> B end,
    lists:foldl(Min, Head, Rest).
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