2010-08-14 32 views
5

做的Y Combinator的單個參數的功能,如Clojure的階乘或斐波那契是有據可查的: http://rosettacode.org/wiki/Y_combinator#Clojure將Y-Combinator應用於Clojure中帶有兩個參數的遞歸函數?

我的問題是 - 你如何代表兩個參數函數做到這一點,如本吸氣的例子嗎?

(這裏的假設是,我想遞歸地解決這個問題。這個非慣用的Clojure代碼是有刻意的另一個原因)

[非Y-組合子版]

(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))'真的是一個複雜的方式來表達'(= N 1)'。順便說一句,爲什麼第四行和第五行比第三行縮進更多? – Svante 2010-08-14 12:59:19

+0

是否有任何特定的原因使這個基於getter 1的? – Svante 2010-08-14 13:01:34

回答

4

自從argsapply'd以來,參數的數量沒有任何變化。你只需要改變的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

這d非常直截了當。

假設你有一個函數H:

(def H 
    (fn [x] 
     (fn [x y] 
       (stuff happens)))) 

然後你擦上同醇」 Y-Combinator的:

((Y H) 4 5) 

45是要傳遞至H參數

組合器本質上是「處理」H中的頂層函數,而不是那些正在努力工作的人(此處爲arity 2)。

相關問題