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

标签 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 程序员来说也应该是可读的。

最佳答案

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

关于list - Erlang:是否可以将最小函数编写为列表折叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168190/

相关文章:

concurrency - Erlang 中的并发

list - 如何通过模型类传递 boolean 值列表并在有状态的小部件中对其进行初始化?

algorithm - 不要跳过列表具有与数组相同的限制?

javascript - 如何从纯 JavaScript 函数中恢复源代码?

javascript - 使用 JavaScript 进行函数式 Web 编程的一个很好的例子是什么?

haskell - 非编程术语中的 Monad

erlang - gen_server 中引发的 Redis 异常

c - 修改Erlang VM Pid

c - 链表元素不见了?

.net - IQueryable IGrouping如何工作