首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(Protocol.UndefinedError)协议可枚举未在%3中实现

(Protocol.UndefinedError)协议可枚举未在%3中实现
EN

Stack Overflow用户
提问于 2017-06-23 11:34:59
回答 1查看 733关注 0票数 0

我试图在理解之后返回一个合计的金额。这是我正在尝试的:

代码语言:javascript
运行
复制
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)

这似乎应该对从理解返回的列表求和,但实际上它输出了以下错误:

代码语言:javascript
运行
复制
#=> ** (Protocol.UndefinedError) protocol Enumerable not implemented for 3

有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-23 12:13:30

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

代码语言:javascript
运行
复制
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来缩短此时间段:

代码语言:javascript
运行
复制
iex(4)> Enum.sum for n <- range, multiple_of_3_or_5?.(n), do: n
233168
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44712655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档