Clojureで2つの引数を持つ再帰関数にYコビネーターを適用しますか?
-
28-09-2019 - |
質問
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)
どこ 4
と 5
あなたがhに渡したい引数です。
組み合わせは、本質的にHのトップレベルの関数を「処理」しており、ハードワークを行っているものではありません(Arity 2を持つもの、こちら)。
所属していません StackOverflow