(Protocol.UndefineError) โปรโตคอลนับไม่ได้นำมาใช้สำหรับ 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

ใครสามารถช่วยเรื่องนี้ได้บ้าง?


person Bitwise    schedule 23.06.2017    source แหล่งที่มา


คำตอบ (1)


คุณกำลังส่งจำนวนเต็มแต่ละตัวเพื่อลดแทนที่จะเป็นรายการที่กรอง คุณควรส่งผลลัพธ์ของ for ถึง 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

คุณยังสามารถใช้ Enum.sum/1 เพื่อย่อสิ่งนี้ได้:

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