【问题标题】:How can I break out of a Enum.reduce in elixir我怎样才能摆脱 Elixir 中的 Enum.reduce
【发布时间】:2018-09-24 02:16:13
【问题描述】:

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

我在长生不老药中得到了以下列表。

iex(4)> steps = [0,1,2,3,-4,5,6,-1]

我计算这个列表的总和如下

Enum.reduce(steps,0,fn x,acc -> acc=acc+x end)

一旦我们遇到负数,如何摆脱reduce?

【问题讨论】:

标签: erlang elixir


【解决方案1】:

使用Enum.reduce_whilehttps://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 )

【讨论】:

    【解决方案2】:

    您可以使用Enum.take_while/2

    从可枚举的开头获取项目,而fun 返回一个真值。

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

    或者使用简写

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

    【讨论】:

    • 考虑用一个术语开始一个管道,如指南所建议的那样:list |> Enum.take_while(& &1 >= 0) |> Enum.sum()。
    【解决方案3】:

    这里的答案缺少递归解决方案,这里是:

    defmodule M do                          
      @steps [0,1,2,3,-4,5,6,-1]
    
      def sum(list, acc \\ 0)
      def sum([], acc), do: acc
      def sum([h|_], acc) when not is_number(h), do: :error
      def sum([h|_], acc) when h < 0, do: acc
      def sum([h|t], acc), do: sum(t, acc + h)
    
      def sum_steps(), do: sum(@steps)
    end
    
    M.sum_steps()
    #⇒ 6
    

    【讨论】:

      【解决方案4】:

      在 Erlang 语法中:

      1> L = [1,2,3,-4,5,6,-1].
      [1,2,3,-4,5,6,-1]
      2> lists:foldl(fun(X,{S,true}) when X >= 0 -> {S+X,true}; (_,{S,_}) -> {S,false} end,{0,true},L).
      {6,false}
      

      当然,即使第一个元素是负数,这个函数也会解析完整的列表。一个简单的“手工”代码可以避免这种情况:

      3> SW = fun SW([H|T],S) when H >= 0 -> SW(T,S+H); SW(_,S) -> S end.
      #Fun<erl_eval.36.127694169>
      4> SumWhilePos = fun(P) -> SW(P,0) end.
      #Fun<erl_eval.6.127694169>
      5> SumWhilePos(L).
      6
      

      【讨论】:

        猜你喜欢
        • 2012-12-26
        • 1970-01-01
        • 2021-01-27
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2022-12-18
        • 1970-01-01
        相关资源
        最近更新 更多