La aplicación de la Y-Combinator a una función recursiva con dos argumentos en Clojure?
-
28-09-2019 - |
Pregunta
Hacer la Y-Combinator para una sola función argumento como factorial o de Fibonacci en Clojure está bien documentada: http://rosettacode.org/wiki/Y_combinator#Clojure
Mi pregunta es - ¿cómo se hace para una función de dos argumentos como este captador por ejemplo
(suposición aquí es que quiero resolver este problema de forma recursiva y este código clojure idiomática no está allí deliberadamente por otra razón)
[versión no y-combinador]
(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))
Solución
El número de argumentos no cambia nada desde el args
se apply
'd. Sólo tiene que cambiar la estructura de 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
Otros consejos
Sería bastante sencillo.
Digamos que tienes una función H:
(def H
(fn [x]
(fn [x y]
(stuff happens))))
A continuación, se aplica el mismo ol' Y-Combinator:
((Y H) 4 5)
Cuando 4
y 5
son argumentos que desea pasar a H.
El combinador está esencialmente "en cuanto a" la función de nivel superior en H, no el que está haciendo el trabajo duro (el que tiene aridad 2, aquí).