使用Elixir了解命名函数

时间:2017-06-23 18:30:59

标签: elixir

我正在编写一个似乎应该可以正常工作的函数。但我想我错过了一些核心的灵丹妙药。这是我正在尝试做的事情:

defmodule ProjectEuler do
  def solve(limit) do
    multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end
    for(n <- limit, multiple_of_3_or_5?.(n), do: n) |> Enum.reduce(0, fn(x, y) -> (x + y) end)
  end

  def print do
    IO.puts solve(1000)
  end
end

这是Project Euler的第一个问题。我不明白为什么这不会返回有效数字?相反,我得到了这个错误

** (Protocol.UndefinedError) protocol Enumerable not implemented for 1000

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

你在做什么相当于

for n <- 1000 do
  ...
end

数字1000不是可枚举的。您将需要Range用于此

for n <- 1..limit do
  ...
end

答案 1 :(得分:2)

在研究了Elixir之后,我想出了第一个Project Euler问题的这个版本。

我觉得它更清楚了!

#!/usr/bin/env elixir
defmodule Problem001 do
  def solve do
    1..999
    |> Enum.filter(fn(x) -> rem(x, 3) == 0 || rem(x, 5) == 0 end)
    |> Enum.sum()
  end
end

IO.puts Problem001.solve

迭代一个范围(1..999),过滤可被3或5整除的数字,然后将它们全部加起来。