(Protocol.UndefinisiError) protokol Enumerable tidak diterapkan untuk 3

Saya mencoba mengembalikan jumlah yang dijumlahkan setelah pemahaman. Inilah yang saya coba:

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)

Sepertinya ini harus menjumlahkan daftar yang dikembalikan dari pemahaman tetapi malah mencetak kesalahan ini:

#=> ** (Protocol.UndefinedError) protocol Enumerable not implemented for 3

Adakah yang bisa membantu dengan ini?


person Bitwise    schedule 23.06.2017    source sumber


Jawaban (1)


Anda meneruskan setiap bilangan bulat ke pengurangan alih-alih daftar yang difilter. Anda harus meneruskan hasil for ke 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

Anda juga dapat menggunakan Enum.sum/1 untuk mempersingkatnya:

iex(4)> Enum.sum for n <- range, multiple_of_3_or_5?.(n), do: n
233168
person Dogbert    schedule 23.06.2017