(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的主要内容,如果未能解决你的问题,请参考以下文章