मैं देख रहा हूं कि कैसे भाषाएं उपयोग-पूर्व-डीफ़ को रोकती हैं और इसमें परिवर्तनीय कोशिकाएं नहीं होती हैं (set!
या setq
) फिर भी रिकर्सन प्रदान कर सकती हैं। मैं निश्चित रूप से भर में भाग गया Y Combinator और दोस्तों, जैसे (प्रसिद्ध कुख्यात?):दो परत "वाई शैली" संयोजक। क्या यह आम है? क्या इसका आधिकारिक नाम है?
- http://www.ece.uc.edu/~franco/C511/html/Scheme/ycomb.html
- http://okmij.org/ftp/Computation/fixed-point-combinators.html
- http://www.angelfire.com/tx4/cus/combinator/birds.html
- http://en.wikipedia.org/wiki/Fixed-point_combinator
जब मैं लागू करने के लिए "चला गया Letrec "इस शैली में अर्थशास्त्र (यानी, एक स्थानीय चर को परिभाषित करने की अनुमति देता है जैसे कि यह एक पुनरावर्ती कार्य हो सकता है, जहां कवर के तहत यह कभी संदर्भ नहीं देता है अपने नाम करने के लिए), Combinator मैं लेखन समाप्त हो गया इस तरह दिखता है:
Y_letrec = λf . (λx.x x) (λs . (λa . (f ((λx.x x) s)) a))
या, यू Combinator बाहर बाँटे:
U = λx.x x
Y_letrec = λf . U (λs . (λa . (f (U s)) a))
इस पढ़ें के रूप में: Y_letrec एक समारोह जो करने के लिए एक लेता है -बे-रिकर्स फ़ंक्शन f
। f
एक एकल-तर्क फ़ंक्शन होना चाहिए जो s
स्वीकार करता है, जहां s
फ़ंक्शन है f
स्वयं-रिकर्सन प्राप्त करने के लिए कॉल कर सकता है। f
को को "आंतरिक" फ़ंक्शन परिभाषित करने और वापस करने की उम्मीद है जो "असली" ऑपरेशन करता है। वह आंतरिक कार्य तर्क a
(या सामान्य मामले में एक तर्क सूची स्वीकार करता है, लेकिन पारंपरिक नोटेशन में व्यक्त नहीं किया जा सकता है)। Y_letrec को कॉल करने का नतीजा f
पर कॉल करने का परिणाम है, और इसे "आंतरिक" फ़ंक्शन माना जाता है, जिसे कॉल करने के लिए तैयार किया जाता है।
कारण मैं चीजों को सेट अप इस तरह से है कि मैं, सीधे होने वाली recursed समारोह की पार्स पेड़ फार्म का उपयोग कर सकता है संशोधन के बिना, केवल परिवर्तन के दौरान इसके चारों ओर एक अतिरिक्त समारोह परत लपेटकर जब letrec से निपटने इसलिए है । जैसे, अगर मूल कोड है:
(letrec ((foo (lambda (a) (foo (cdr a))))))
तो तब्दील प्रपत्र की तर्ज पर होगा:
(define foo (Y_letrec (lambda (foo) (lambda (a) (foo (cdr a))))))
ध्यान दें कि आंतरिक समारोह शरीर दोनों के बीच समान है।
मेरे प्रश्न हैं:
- मेरी Y_letrec समारोह आमतौर पर इस्तेमाल किया है?
- क्या इसका एक अच्छी तरह से स्थापित नाम है?
नोट: उपरोक्त पहला लिंक "आवेदक-आदेश वाई संयोजक" के रूप में एक समान कार्य ("चरण 5" में) को संदर्भित करता है, हालांकि मुझे उस नामकरण के लिए एक आधिकारिक स्रोत खोजने में परेशानी हो रही है।
अद्यतन 28-अप्रैल 2013:
मैंने महसूस किया कि Y_letrec ऊपर परिभाषित बहुत के करीब लेकिन के रूप में विकिपीडिया में परिभाषित जेड Combinator के समान नहीं है। प्रति विकिपीडिया के अनुसार, जेड संयोजक और "कॉल-बाय-वैल्यू वाई संयोजक" एक ही चीज हैं, और ऐसा लगता है कि वास्तव में यह चीज है जिसे "आवेदक-आदेश वाई संयोजक" कहा जा सकता है।
तो, मेरे ऊपर क्या है आमतौर पर लिखित आवेदक-आदेश वाई संयोजक के समान ही है, लेकिन लगभग निश्चित रूप से एक भावना है जिसमें वे संबंधित हैं।
Y_letrec = λf . (λx.x x) (λs . (λa . (f ((λx.x x) s)) a))
भीतरी यू लागू करें::
Y_letrec = λf . (λx.x x) (λs . (λa . (f (s s)) a))
लागू बाहरी यू:
के साथ शुरू:
Y_letrec = λf . (λs . (λa . (f (s s)) a)) (λs . (λa . (f (s s)) a))
नाम बदलें विकिपीडिया की परिभाषा से मेल करने के यहाँ कैसे मैं तुलना किया है जेड संयोजक का:
Y_letrec = λf . (λx . (λv . (f (x x)) v)) (λx . (λv . (f (x x)) v))
विकिपीडिया के जेड Combinator को यह तुलना करें: जहां समारोह f
लागू किया जा रहा है
Z = λf . (λx . f (λv . ((x x) v))) (λx . f (λv . ((x x) v)))
मुख्य अंतर है। फर्क पड़ता है क्या? क्या ये अंतर इस अंतर के बावजूद बराबर हैं?
जैसा कि मुझे याद है, आवेदक आदेश सामान्य आदेश के साथ समझा जाता है। आवेदक आदेश भाषाओं में योजना तर्कों का तुरंत मूल्यांकन किया जाता है, इससे पहले कि कार्य उन्हें देखे। यह जटिल वाई-संयोजक को परिभाषित करता है। सामान्य क्रम में, पारंपरिक लैम्ब्डा कैलकुस के रूप में, पैरामीटर चारों ओर पारित होते हैं और केवल कोई अन्य विकल्प नहीं होने पर मूल्यांकन किया जाता है। वाई-संयोजक सामान्य क्रम में सरल होते हैं उदा। [हिंडली और सेल्डेन] (http://www.amazon.com/Lambda-Calculus-Combinators- परिचय- Roger-Hindley/dp/0521898854/ref=sr_1_3?ie=UTF8&qid=1367127702&sr=8-3&keywords=lambda+calculus) पी। 34. – Mars