जो प्राणी आप खोज रहे हैं वह वाई * संयोजक है।
this page by oleg-at-okmij.org के आधार पर मैं Y * Clojure में पोर्ट:
(defn Y* [& fs]
(map (fn [f] (f))
((fn [x] (x x))
(fn [p]
(map
(fn [f]
(fn []
(apply f
(map
(fn [ff]
(fn [& y] (apply (ff) y)))
(p p)))))
fs)))))
आपसी पुनरावर्ती क्रिया की क्लासिक उदाहरण इसलिए यहाँ भी/अजीब है उदाहरण है:
(let
[[even? odd?]
(Y*
(fn [e o]
(fn [n]
(or (= 0 n) (o (dec n)))))
(fn [e o]
(fn [n]
(and (not= 0 n) (e (dec n)))))
)
]
(do
(assert (even? 14))
(assert (odd? 333))
))
आप कर सकते हैं यदि आप बड़े पर्याप्त तर्कों का उपयोग करते हैं तो आसानी से इस फ़ंक्शन के साथ स्टैक को उड़ाएं, इसलिए यहां इसका ट्रैम्पोलिन्ड संस्करण है उदाहरण के लिए पूर्णता जो स्टैक का उपभोग नहीं करती है:
(let
[[even? odd?]
(Y*
(fn [e o]
(fn [n]
(or (= 0 n) #(o (dec n)))))
(fn [e o]
(fn [n]
(and (not= 0 n) #(e (dec n)))))
)
]
(do
(assert (trampoline even? 144444))
(assert (trampoline odd? 333333))
))
Y * Combinator monadic पारसर्स, जिनमें से मैं तैयार रहें lambder.com पर जल्द ही ब्लॉग होगा, के आपसी पुनरावर्ती परिभाषाओं को परिभाषित करने के लिए बहुत उपयोगी है;)
- Lambder
हैकेल! = लैम्ब्डा-कैलकुस – eschulte