2017-06-23 75 views
0

我试图在理解后返回总计量。下面是我想:(Protocol.UndefinedError)协议枚举未实现3

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 

任何人都可以在这方面帮助?

回答

3

您正在传递每个整数来减少而不是筛选列表。你应该通过的结果forEnum.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