Die Anwendung des Y-Combinator auf eine rekursive Funktion mit zwei Argumenten in Clojure?
-
28-09-2019 - |
Frage
Dadurch könnte die Y-Combinator für eine einzige Argument Funktion wie faktorielle oder Fibonacci in Clojure ist gut dokumentiert: http://rosettacode.org/wiki/Y_combinator#Clojure
Meine Frage ist - wie Sie es für eine zwei Argument Funktion wie dieses Getter zum Beispiel tun
(Annahme hier ist, dass ich dieses Problem rekursiv lösen wollen und diese nicht-idiomatische clojure Code ist es absichtlich aus einem anderen Grund)
[non y-combinator Version]
(defn get_ [n lat]
(cond
(empty? lat) ()
(= 0 (- n 1)) (first lat)
true (get_ (- n 1) (rest lat))))
(get_ 3 '(a b c d e f g h i j))
Lösung
Die Anzahl der args ändert nichts, da die args
apply
'd werden. Sie müssen nur die Struktur von get_
ändern:
(defn get_ [f] (fn [n lat] (cond (empty? lat) () (= 1 n) (first lat) :else (f (dec n) (next lat))))) (defn Y [f] ((fn [x] (x x)) (fn [x] (f (fn [& args] (apply (x x) args))))))
user=> ((Y getf) 3 '(a b c d e f g h i j)) c
Andere Tipps
Es wäre ziemlich einfach sein.
Sagen Sie haben eine Funktion H bekommen:
(def H
(fn [x]
(fn [x y]
(stuff happens))))
Dann bewerben Sie die gleiche ol‘Y-Combinator:
((Y H) 4 5)
Wo 4
und 5
sind Argumente, die Sie H. übergeben möchten
Die combinator ist im Wesentlichen die Funktion der obersten Ebene in H „mit zu tun“, nicht derjenige, der die harte Arbeit tut (die mit arity 2, hier).