【问题标题】:(Protocol.UndefinedError) protocol Enumerable not implemented for 3(Protocol.UndefinedError) 协议 Enumerable 未实现 3
【发布时间】:2017-11-26 12:22:28
【问题描述】:

我试图在理解后返回一个总和。这是我正在尝试的:

range = 1..999

multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end
for n <- range, multiple_of_3_or_5?.(n),
  do: Enum.reduce(n, 0, fn(x, y) -> (x + y) end)

这似乎应该对从理解返回的列表求和,但它会打印此错误:

#=> ** (Protocol.UndefinedError) protocol Enumerable not implemented for 3

有人可以帮忙吗?

【问题讨论】:

    标签: enums elixir phoenix-framework


    【解决方案1】:

    您将每个整数传递给 reduce 而不是过滤后的列表。您应该将for 的结果传递给Enum.reduce/3

    iex(1)> range = 1..999
    1..999
    iex(2)> multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end
    #Function<6.118419387/1 in :erl_eval.expr/5>
    iex(3)> for(n <- range, multiple_of_3_or_5?.(n), do: n) |> Enum.reduce(0, fn(x, y) -> (x + y) end)
    233168
    

    你也可以使用Enum.sum/1来缩短这个:

    iex(4)> Enum.sum for n <- range, multiple_of_3_or_5?.(n), do: n
    233168
    

    【讨论】:

      猜你喜欢
      • 2015-09-03
      • 2017-07-01
      • 2018-10-19
      • 2023-03-19
      • 2016-09-17
      • 2016-04-26
      • 2016-09-29
      • 2018-02-11
      • 2016-06-16
      相关资源
      最近更新 更多