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))
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top