如何在灵药中打破Enum.reduce

aru*_*ani 6 erlang elixir

我想找到第一个负数之前的所有正数的总和.

我在elixir中得到以下列表.

iex(4)> steps = [0,1,2,3,-4,5,6,-1]
Run Code Online (Sandbox Code Playgroud)

我按如下方式计算此列表的总和

Enum.reduce(steps,0,fn x,acc -> acc=acc+x end)
Run Code Online (Sandbox Code Playgroud)

一旦我们达到负数,如何减少?

Gav*_*aff 13

使用Enum.reduce_while https://hexdocs.pm/elixir/Enum.html#reduce_while/3

[1,2,3,-4,5,6,-1] |> Enum.reduce_while(0, fn x, acc ->
   if x > 0, do: {:cont, acc + x}, else: {:halt, acc}
end )
Run Code Online (Sandbox Code Playgroud)


Bit*_*ise 7

您可以使用 Enum.take_while/2

从枚举的开头获取项目,同时fun返回真值.

Enum.take_while([0, 1, 2, 3, -4, 5, 6, -1], fn(x) -> x >= 0 end) |> Enum.sum

=> 6
Run Code Online (Sandbox Code Playgroud)

或者使用速记

list = [0, 1, 2, 3, -4, 5, 6, -1]
Enum.take_while(list, &(&1 >= 0)) |> Enum.sum
Run Code Online (Sandbox Code Playgroud)