2010-08-14 9 views
5

Haciendo la Y-Combinator para una sola función argumento como factorial o de Fibonacci en Clojure está bien documentado: http://rosettacode.org/wiki/Y_combinator#Clojure¿Aplica el Combinador Y a una función recursiva con dos argumentos en 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 yo quiero resolver este problema de forma recursiva y este código clojure no idiomática está allí deliberadamente por otra razón)

[versión de Y-Combinator no]

(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)) 
+0

'(= 0 (- n 1))' es realmente una forma elaborada de decir '(n = 1)'. ¿Por qué la cuarta y la quinta línea tienen más sangría que la tercera, por cierto? – Svante

+0

¿Hay alguna razón específica para hacer este getter 1? – Svante

Respuesta

4

El número de args no cambia nada ya que args son 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 
2

Es ser bastante directo.

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) 

Dónde 4 y 5 son argumentos que desea pasar a H

El combinador es esencialmente "tratar con" la función de nivel superior en H, no la que está haciendo el trabajo duro (el que tiene arity 2, aquí).

Cuestiones relacionadas