Applicando la Y-Combinator a una funzione ricorsiva con due argomenti in Clojure?
-
28-09-2019 - |
Domanda
Facendo Y Combinator per una singola funzione argomento atto fattoriale o Fibonacci in Clojure è ben documentato: http://rosettacode.org/wiki/Y_combinator#Clojure
La mia domanda è - come si fa a farlo per una funzione a due argomenti come questo getter ad esempio
(Assunzione qui è che io voglio risolvere questo problema in modo ricorsivo e questo codice clojure non idiomatica c'è volutamente per un altro motivo)
[versione non y-Combinator]
(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))
Soluzione
Il numero di argomenti non cambia nulla dal momento che il args
sono apply
'd. Hai solo bisogno di cambiare la struttura del get_
:
(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
Altri suggerimenti
Sarebbe piuttosto semplice.
Di 'hai una funzione H:
(def H
(fn [x]
(fn [x y]
(stuff happens))))
quindi si applica la stessa ol' Y-Combinator:
((Y H) 4 5)
Dove 4
e 5
sono argomenti che si desidera passare a H.
Il combinatore è essenzialmente "a che fare con" la funzione di livello superiore in H, non quello che sta facendo il duro lavoro (quello con arità 2, qui).