(Protocol.UndefinedError) 协议 Enumerable 未实现 3

Posted

技术标签:

【中文标题】(Protocol.UndefinedError) 协议 Enumerable 未实现 3【英文标题】:(Protocol.UndefinedError) protocol Enumerable not implemented for 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

有人可以帮忙吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于(Protocol.UndefinedError) 协议 Enumerable 未实现 3的主要内容,如果未能解决你的问题,请参考以下文章