2017-06-23 9 views
0

私は理解の後に合計金額を返そうとしています。それは理解から返されたリストを合計しなければならないよう(Protocol.UndefinedError)プロトコルEnumerableが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

フィルタリングされたリストの代わりに、各整数を減らすために渡しています。あなたはEnum.reduce/3forの結果を渡す必要があります。

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 
関連する問題