2017-06-23 100 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