【问题标题】:Understand named functions with Elixir用 Elixir 理解命名函数
【发布时间】:2017-11-27 09:56:00
【问题描述】:

我正在编写一个看起来应该可以正常工作的函数。但我认为我错过了灵丹妙药的核心。这是我想要做的:

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

这是欧拉计划的第一个问题。我不明白为什么这不返回有效数字?相反,我收到此错误

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

我在这里做错了什么?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    你所做的相当于

    for n <- 1000 do
      ...
    end
    

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

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

    【讨论】:

      【解决方案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 整除的数字,然后将它们全部相加。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-07
        • 2017-08-25
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多