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)
这样我就可以递归调用匿名函数.
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)