मुझे नहीं लगता कि एक एकल स्व-अनुप्रयोग फ़ंक्शन है जो हास्केल में सभी शर्तों के लिए काम करेगा। स्व-अनुप्रयोग टाइप किए गए लैम्ब्डा कैलकुस में एक अनोखी चीज है, जो अक्सर टाइपिंग से बच जाएगी। यह तथ्य यह है कि स्वयं आवेदन के साथ हम निश्चित बिंदु Combinator, जो प्रकार प्रणाली जब एक तार्किक प्रणाली के रूप में देखा में विसंगतियों का परिचय व्यक्त कर सकते हैं से संबंधित है (देखें करी-हावर्ड पत्राचार)।
आपने इसे id
फ़ंक्शन पर लागू करने के बारे में पूछा। स्वयं आवेदन id id
में, दो id
रों विभिन्न प्रकार की है। अधिक स्पष्ट रूप से यह (id :: (A -> A) -> (A -> A)) (id :: A -> A)
(किसी भी प्रकार के A
के लिए) है।
sa :: (forall a. a -> a) -> b -> b
sa f = f f
ghci> :t sa id
sa id :: b -> b
जो सिर्फ ठीक काम करता है, बल्कि अपने प्रकार द्वारा सीमित है: हम एक स्वयं आवेदन विशेष रूप से id
समारोह के लिए बनाया गया हो सकता है।
का उपयोग RankNTypes
आप इस तरह स्वयं आवेदन कार्यों के परिवारों बना सकते हैं, लेकिन आप एक सामान्य आत्म आवेदन समारोह ऐसा है कि sa t
हो जाएगा t t
iff अच्छी तरह से टाइप करने में सक्षम होना करने के लिए नहीं जा रहे हैं अच्छी तरह से आपके द्वारा लिखा गया है (कम से कम सिस्टम Fω ("एफ-ओमेगा") में नहीं, जो जीएचसी का कोर कैलकुस पर आधारित है)।
कारण, यदि आप इस पर काम औपचारिक रूप से (शायद), तो हम sa sa
, जो कोई सामान्य रूप है हो सकता है कि है, और Fω सामान्य होने के लिए जाना जाता है (जब तक हम निश्चित रूप से fix
जोड़ें)।
आप किस तरह सोचते हैं 'sa' होना चाहिए? याद रखें कि हास्केल में सभी शर्तों में एक प्रकार होना चाहिए। इसके अलावा, आप किस समस्या को हल करने की कोशिश कर रहे हैं? – Alec
@Alec मुझे नहीं पता, यह एक ऐसा फ़ंक्शन लेता है जो कोई फ़ंक्शन ले सकता है? मैं सिर्फ लैम्ब्डा कैलकुस सीख रहा हूं और सोच रहा हूं कि इसे हास्केल में कैसे व्यक्त किया जाए। मैंने सोचा कि हास्केल प्रत्येक उदाहरण की जांच करना अच्छा होगा, लेकिन मैं तुरंत अटक गया। शायद इस उद्देश्य के लिए लिस्प या योजना आसान है। –
यह कोई फर्क नहीं पड़ता कि आप किस भाषा का उपयोग करते हैं। टाइप किए गए लैम्ब्डा कैलकुस में इस फ़ंक्शन को बनाने का प्रयास करें और सोचें कि इसका किस प्रकार होना चाहिए।समस्या हम समान होंगे, आप असीमित प्रकार – Euge