【问题标题】:Call an anonymous function 100 times in Elixir在 Elixir 中调用匿名函数 100 次
【发布时间】:2020-11-14 08:59:52
【问题描述】:

我正在尝试使用 Elixir 解决经典的 fizzbuzz 问题。我找到了几种不同的方法来解决这个问题,但最好的方法是:

fizzbuzz = fn
  (0, 0, _) -> "FizzBuzz"
  (0, _, _) -> "Fizz"
  (_, 0, _) -> "Buzz"
  (_, _, a) -> a
end

fb = fn n -> fizzbuzz.(rem(n, 3), rem(n, 5), n) end

fb.(10)

我现在的问题是我想调用 fb 匿名函数 100 次。在 ruby​​ 中,它看起来像这样:

 100.times do |i|
   fb.(i)
 end

显然,这是行不通的,因为您不能在 Ruby 中调用这样的匿名函数。但我希望你能得到这张照片。如何在 Elixir 中实现这一点?

【问题讨论】:

  • 旁注:您显然可以将 ruby​​ 中的 lambda 称为 fb.(i),它绝对是 fb.call(i) 的合法语法糖。

标签: elixir phoenix-framework


【解决方案1】:
(1 .. 100) |> Enum.each(fb)

【讨论】:

  • 打印 fizzbuzz 结果列表:(1 .. 100) |> Enum.map(fb) |> Enum.map(&IO.inspect/1)
  • 当我这样做时 IO.puts (1 .. 100) |> Enum.each(fb) 它只会在控制台中打印出来。
【解决方案2】:

调用没有结果的函数

如果您只想执行函数n 次而不返回任何结果(例如将其打印到控制台或将其转换到 GenServer),Enum.each/2 是您的最佳选择。

my_fun = fn x -> x * x end
#=> #Function<6.52032458/1 in :erl_eval.expr/5>

(1..100) |> Enum.each(my_fun)
#=> :ok

返回结果

但是如果你需要返回结果,你应该使用Enum.map/2:

(1..100) |> Enum.map(my_fun)
#=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, ...]

您也可以将它们组合在一起:

(1..100) |> Enum.map(my_fun) |> Enum.each(&IO.puts/1)
#=> 1
#=> 4
#=> 9
#=> 16
#=> 25 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2014-03-25
    • 2014-09-11
    • 2018-03-07
    • 2023-03-25
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多