5

Clojure で factorial や fibonacci などの単一の引数関数に対して Y-Combinator を実行することについては、十分に文書化されています: http://rosettacode.org/wiki/Y_combinator#Clojure

私の質問は、たとえば、このゲッターなどの 2 つの引数関数に対してどのように行うのですか?

(ここでの前提は、この問題を再帰的に解決したいということであり、この非慣用的な 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))
4

2 に答える 2

4

args引数の数はapply'd'であるため、何も変更されません。の構造を変更するだけですget_:

(defn get_ [f]
  (fn [n 緯度]
    (状態
      (空?緯度) ()
      (= 1 n) (最初の緯度)
      :else (f (dec n) (次の緯度)))))

(定義 Y [f]
  ((fn [x] (xx))
   (fn [x]
     (f (fn [& args]
          ((xx) 引数を適用))))))
ユーザー=> ((Y getf) 3 '(abcdefghij))
c
于 2010-08-14T21:26:57.080 に答える
2

それはかなり簡単です。

関数 H があるとします。

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

次に、同じ昔ながらの Y コンビネーターを適用します。

((Y H) 4 5)

45は、H に渡す引数です。

コンビネータは本質的に H の最上位関数を「処理」しており、ハードワークを行っている関数 (ここではアリティ 2 の関数) ではありません。

于 2010-08-14T16:48:10.340 に答える