अवधारणाओं आप इस प्रकार के हस्ताक्षर की समझ बनाने के लिए समझने की जरूरत है की एक जोड़ी रहे हैं और मैं नहीं जानता कि कौन सा आप पहले से ही है, इसलिए मैं अपना सर्वश्रेष्ठ करने की कोशिश की हर महत्वपूर्ण अवधारणा समझाने के लिए:
Currying
जैसा कि आप जानते हैं, यदि आपके पास foo -> bar
टाइप है, तो यह foo
प्रकार का तर्क लेने और bar
प्रकार का परिणाम लौटने का वर्णन करता है। चूंकि ->
सही साहचर्य है, प्रकार foo -> bar -> baz
foo -> (bar -> baz)
रूप में ही है और इस तरह एक समारोह प्रकार foo
का एक तर्क ले रहे हैं और जिसका अर्थ वापसी मान एक समारोह प्रकार bar
के एक मूल्य लेने और एक लौटने है प्रकार bar -> baz
के एक मूल्य, लौटने का वर्णन करता है baz
प्रकार का मान।
एक समारोह my_function my_foo my_bar
, जो क्योंकि समारोह आवेदन बाएं साहचर्य है, (my_function my_foo) my_bar
रूप में ही है जैसे कहा जा सकता है इस तरह के, यानी यह तर्क my_foo
पर लागू होता है my_function
और फिर समारोह है कि तर्क करने के लिए एक परिणाम के रूप में किया जाता है पर लागू होता है my_bar
।
क्योंकि इसे इस तरह कहा जा सकता है, foo -> bar -> baz
के एक फ़ंक्शन को अक्सर "दो तर्क लेने वाला फ़ंक्शन" कहा जाता है और मैं इस शेष उत्तर में ऐसा करूँगा।
प्रकार चर
आप let f x = x
की तरह एक समारोह को परिभाषित है, यह प्रकार 'a -> 'a
होगा। लेकिन 'a
वास्तव में ओकैमल मानक पुस्तकालय में कहीं भी परिभाषित प्रकार नहीं है, तो यह क्या है?
'
के साथ शुरू होने वाला कोई भी प्रकार एक तथाकथित प्रकार परिवर्तनीय है। किसी प्रकार का चर किसी भी संभावित प्रकार के लिए खड़ा हो सकता है। तो f
के ऊपर उदाहरण में int
या string
या list
या किसी भी चीज़ के साथ कहा जा सकता है - इससे कोई फर्क नहीं पड़ता।
इसके अलावा यदि एक ही प्रकार का चर एक बार हस्ताक्षर में एक से अधिक बार प्रकट होता है, तो यह उसी प्रकार के लिए खड़ा होगा। तो ऊपर दिए गए उदाहरण में इसका मतलब है कि f
का रिटर्न प्रकार तर्क प्रकार के समान है। तो यदि f
को int
के साथ बुलाया जाता है, तो यह int
देता है। अगर इसे string
के साथ बुलाया जाता है, तो यह string
और इसी तरह से लौटाता है।
तो 'a -> 'b -> 'a
प्रकार का एक फ़ंक्शन किसी भी प्रकार के दो तर्क (जो पहले और दूसरे तर्क के लिए समान प्रकार नहीं हो सकता है) ले सकता है और उसी प्रकार का मान देता है जैसे कि पहले तर्क के रूप में, 'a -> 'a -> 'a
एक ही प्रकार के दो तर्क लेगा।
टाइप अनुमान के बारे में एक नोट: जब तक आप स्पष्ट रूप से फ़ंक्शन को एक प्रकार का हस्ताक्षर नहीं देते, ओकैम हमेशा आपके लिए सबसे सामान्य प्रकार का अनुमान लगाएगा। इसलिए जब तक कोई फ़ंक्शन किसी भी ऑपरेशन का उपयोग नहीं करता है जो केवल किसी दिए गए प्रकार (उदाहरण के लिए +
) के साथ काम करता है, तो अनुमानित प्रकार में प्रकार चर शामिल होंगे।
अब प्रकार समझाने के लिए ...
val something : ('a -> 'b -> 'c) -> ('a -> 'd -> 'b) -> 'a -> 'd -> 'c = <fun>
इस प्रकार का हस्ताक्षर आपको बताता है कि something
एक समारोह चार तर्क ले रहा है।
पहला तर्क का प्रकार 'a -> 'b -> 'c
है। अर्थात। एक समारोह मनमानी और संभवतः विभिन्न प्रकार के दो तर्क लेता है और मनमाना प्रकार का मूल्य लौटाता है।
दूसरा तर्क का प्रकार 'a -> 'd -> 'b
है। यह फिर से दो तर्कों के साथ एक समारोह है। यहां ध्यान देने योग्य महत्वपूर्ण बात यह है कि फ़ंक्शन के पहले तर्क में पहले फ़ंक्शन के पहले तर्क के समान प्रकार होना चाहिए और फ़ंक्शन के वापसी मूल्य में पहले फ़ंक्शन के दूसरे तर्क के समान प्रकार होना चाहिए।
तीसरा तर्क का प्रकार 'a
है, जो कि दोनों कार्यों के पहले तर्कों का प्रकार भी है।
आखिरकार, चौथे तर्क का प्रकार 'd
है, जो दूसरे फ़ंक्शन के दूसरे तर्क का प्रकार है।
वापसी मूल्य 'c
प्रकार, यानी पहले फ़ंक्शन का रिटर्न प्रकार होगा।
शब्दावली नोट (जो आपकी साहित्य खोजों में मदद कर सकता है): ओकंपल में "हस्ताक्षर" का अर्थ आमतौर पर कुछ और अर्थात् मूल अभिव्यक्तियों और मूल्यों के बजाय मॉड्यूल के लिए होता है। आप जो पूछ रहे हैं उसे कभी-कभी "टाइप हस्ताक्षर" कहा जाता है लेकिन अक्सर चर "होते हैं" या "टाइप स्कीम" होते हैं। – Gilles