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)
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)
在空列表中崩溃程序,推荐的方法"让它崩溃"而不是防御性编程.