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))
War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top