在Elixir中命名为匿名函数

Mah*_*dam 5 elixir

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

fib_fun = fn fib n -> if n <= 1 do 1 else fib(n - 1) + fib(n - 2) end end
Run Code Online (Sandbox Code Playgroud)

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

She*_*yar 7

Elixir不支持匿名函数中的递归,但您可以将其实现为具有如下保护子句的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
Run Code Online (Sandbox Code Playgroud)

并像往常一样调用它:

fib.(5)
#=> 8
Run Code Online (Sandbox Code Playgroud)

因此,将它作为模块内部的常规方法(也看起来更干净)更好:

defmodule Fibonacci do
  def get(n) when n <= 1, do: 1
  def get(n), do: get(n-1) + get(n-2)
end
Run Code Online (Sandbox Code Playgroud)