سؤال

تم توثيق جيدًا على 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 ، هنا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top