在Elixir中命名为匿名函数

时间:2017-06-30 02:24:24

标签: elixir

Elixir是否支持类似于Clojure的命名匿名函数? 例如,我想做这样的事情:

fib_fun = fn fib n -> if n <= 1 do 1 else fib(n - 1) + fib(n - 2) end end

这样我就可以递归调用匿名函数。

1 个答案:

答案 0 :(得分:7)

Elixir doesn't support recursion in anonymous functions ,但您可以将其实现为guard clauses的Y-Combinator,如下所示:

fib = fn x ->
  fun = fn
    (n, _) when n <= 1 -> 1
    (n, fun) -> fun.(n-1, fun) + fun.(n-2, fun)
  end

  fun.(x, fun)
end

并像往常一样打电话:

fib.(5)
#=> 8

所以最好将它作为模块中的常规方法编写(它看起来也会更清晰):

defmodule Fibonacci do
  def get(n) when n <= 1, do: 1
  def get(n), do: get(n-1) + get(n-2)
end