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))
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top