2017-06-30 3 views
4

Unterstützt Elixir anonyme Funktionen, die denen von Clojure ähneln? Zum Beispiel möchte ich so etwas wie dies zu tun:Anonyme Funktionen in Elixir benannt

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

so dass ich rekursiv die anonyme Funktion aufrufen kann.

Antwort

6

Elixir doesn't support recursion in anonymous functions, aber Sie es als Y-Combinator mit guard clauses wie folgt implementieren:

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 

und es nennen wie üblich:

fib.(5) 
#=> 8 

So ist es eine bessere Idee, es einfach als eine normale Methode innerhalb eines Moduls zu schreiben (was auch viel sauberer aussehen würde):

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