質問

Clojureの要因やフィボナッチなどの単一の引数関数に対してYコビネーターを行うことは、よく文書化されています。http://rosettacode.org/wiki/y_combinator#clojure

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

(ここでの仮定は、私がこの問題を再帰的に解決したいということです。そして、この非イデオマティックなClojureコードは、別の理由で意図的にあります)

非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))
役に立ちましたか?

解決

ARGSの数は何も変わりません args それは apply'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

他のヒント

それはかなり簡単です。

関数hを持っているとしましょう:

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

次に、同じol 'y-combinatorを適用します。

((Y H) 4 5)

どこ 45 あなたがhに渡したい引数です。

組み合わせは、本質的にHのトップレベルの関数を「処理」しており、ハードワークを行っているものではありません(Arity 2を持つもの、こちら)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top