تطبيق y-combinator على وظيفة عودية مع وسيطتين في clojure؟
-
28-09-2019 - |
سؤال
تم توثيق جيدًا على y-combinator لوظيفة وسيطة واحدة مثل Factorial أو Fibonacci في Clojure:http://rosettacode.org/wiki/y_combinator#clojure
سؤالي هو - كيف تفعل ذلك لوظيفة وسيطة مثل هذا getter على سبيل المثال؟
(الافتراض هنا هو أنني أريد حل هذه المشكلة بشكل متكرر وهذا رمز 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
'د. تحتاج فقط إلى تغيير بنية 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
نصائح أخرى
سيكون مستقيمًا إلى الأمام.
قل أن لديك وظيفة ح:
(def H
(fn [x]
(fn [x y]
(stuff happens))))
ثم تقوم بتطبيق نفس ol 'y-combinator:
((Y H) 4 5)
أين 4
و 5
هي الحجج التي تريد نقلها إلى H.
Combinator هو أساسا "التعامل مع" وظيفة المستوى الأعلى في H ، وليس الوظيفة التي تقوم بالعمل الشاق (واحد مع arity 2 ، هنا).
لا تنتمي إلى StackOverflow