खैर, y
, कुछ a
, b
और c
हम अभी तक पता नहीं के लिए प्रकार (a -> b) -> c
का हो गया है; आखिरकार, यह एक फ़ंक्शन लेता है, f
, और इसे एक तर्क पर लागू करता है, इसलिए यह एक फ़ंक्शन लेने वाला फ़ंक्शन होना चाहिए।
y f = f x
के बाद से (फिर से, कुछ x
के लिए), हम जानते हैं कि y
की वापसी प्रकार f
खुद की वापसी प्रकार होना चाहिए। इसलिए, हम y
के प्रकार को थोड़ा सा परिशोधित कर सकते हैं: कुछ a
और b
के लिए हमें अभी तक पता नहीं है।
यह पता लगाने के लिए कि a
क्या है, हमें केवल f
पर दिए गए मान के प्रकार को देखना होगा। यह y f
है, जो अभिव्यक्ति है जिसे हम अभी इस प्रकार का पता लगाने की कोशिश कर रहे हैं। हम कह रहे हैं कि y
का प्रकार (a -> b) -> b
है (कुछ a
, b
इत्यादि के लिए), इसलिए हम कह सकते हैं कि y f
का यह एप्लिकेशन b
प्रकार का होना चाहिए।
तो, f
को तर्क के प्रकार b
है। इसे सब एक साथ वापस रखो, और हमें (b -> b) -> b
मिलता है - जो निश्चित रूप से (a -> a) -> a
जैसा ही है।
यहाँ चीजों के एक अधिक सहज ज्ञान युक्त है, लेकिन कम सटीक दृश्य है: हम कह रहे हो कि y f = f (y f)
है, जो हम बराबर y f = f (f (y f))
, y f = f (f (f (y f)))
लिए विस्तार कर सकते हैं, और इतने पर। तो, हम जानते हैं कि हम हमेशा पूरी बात के चारों ओर एक और f
आवेदन कर सकते हैं, और "पूरी बात" प्रश्न में के बाद से एक तर्क को f
लागू करने का परिणाम है, f
प्रकार a -> a
के लिए है; और चूंकि हमने अभी निष्कर्ष निकाला है कि पूरी बात f
को तर्क के लिए लागू करने का परिणाम है, y
का रिटर्न प्रकार f
स्वयं होना चाहिए - फिर से, (a -> a) -> a
के रूप में एक साथ आना चाहिए।
मान लीजिए यह वास्तविक कोड है, बस आग जो भी इसके साथ आया था। –
@ मार्टिनजम्स: हुह? कोड के साथ गलत क्या लगता है?यह फ़ंक्शन को परिभाषित करने का सबसे अच्छा तरीका नहीं है, लेकिन यह सबसे आसान है। –
@ मार्टिनजेम्स, यह फ़ंक्शन एक अच्छी तरह से अध्ययन किया गया फ़ंक्शन है जिसे [वाई कॉम्बिनेटर] (http://en.wikipedia.org/wiki/Fixed-point_combinator) कहा जाता है। (मुझे लगता है कि यह सही है - मैं इस समय विकिपीडिया को दोबारा जांच नहीं सकता!) वैसे भी, शायद आपको इस तरह के एक फिलिस्टीन होने के लिए निकाल दिया जाएगा :-) –