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

Mag*_*ist 5 erlang functional-programming list fold higher-order-functions

给定一个功能:

min(A, B)  when A =< B -> A;
min(_A, B)             -> B.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ada*_*erg 11

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

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

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

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

  • 传递`undefined`是有效的,因为在使用异类类型时,```运算符有一个明确定义的顺序.特别是,数字总是小于原子.在参考手册中查找订单功能. (3认同)

Yas*_*aev 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
Run Code Online (Sandbox Code Playgroud)

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