2013-08-02 10 views
7

मैं कार्यात्मक प्रोग्रामिंग सीख रहा हूं और ओकैम का उपयोग कर रहा हूं, लेकिन मुझे कार्यों के साथ कुछ समस्या है।कार्यात्मक प्रोग्रामिंग फ़ंक्शन भ्रम

वैसे भी, मेरे पास एक ट्यूपल है और मैं अपना पहला मान वापस करना चाहता हूं। (बहुत सरल मुझे पता है, क्षमा करें)

let bach (x,y):(float*float) = (x,y);; 
val bach : float * float -> float * float = <fun> 

सभी अच्छी और अच्छी तरह से यहां।

let john (x,y):(float*float) = y;; 
val john : 'a * (float * float) -> float * float = <fun> 

अब यह मुझे भ्रमित करता है। वहां 'a क्यों है? मुझे पता है कि यह एक अज्ञात प्रकार के साथ एक चर के लिए खड़ा है, लेकिन मैं उलझन में हूं कि रिटर्न वैल्यू को बदलने के तरीके में क्या कहा जाता है।

मैं कार्यात्मक प्रोग्रामिंग में एक आत्म पेशेवर n00b हूँ, मुझे नहीं खाते कृपया :)

उत्तर

10

आप एक सूक्ष्म वाक्य रचना गलती है कि शुरुआती के लिए वास्तव में गैर स्पष्ट है ने काट लिया गया:

let foo x : t = bar 

नहीं एक ही रूप में

let foo (x : t) = bar 

यह

let foo x = (bar : t) 
के विपरीत बराबर पर है

फ़ंक्शन के रिटर्न प्रकार को बाधित करता है।

तो तुम लिखा है

let john (x, y) = (y : float * float) 

इनपुट प्रकार एक जोड़ी जिसका दूसरा तत्व, y, है टाइप float * float है। लेकिन x किसी भी प्रकार का हो सकता है, इसलिए फ़ंक्शन पॉलिमॉर्फिक इसके प्रकार में है, जो इसे एक प्रकार परिवर्तनीय 'a के रूप में दर्शाता है। पूरे फ़ंक्शन का प्रकार, 'a * (float * float) -> float * float, इंगित करता है कि किसी भी प्रकार के 'a के लिए, आप 'a और (float * float) का टुपल पास कर सकते हैं, और यह (float * float) लौटाएगा।

let snd (x, y) = y 

टाइप 'a * 'b -> 'b है जो:

यह snd समारोह का एक विशेष विषय है किसी भी 'a और 'b के लिए, आप एक जोड़ी ('a * 'b) लेने के लिए और प्रकार 'b का मान प्रदान।

1

आपके दोनों उदाहरणों में आप परिभाषित फ़ंक्शन के परिणाम के लिए टाइप-बाधाएं दे रहे हैं, इसकी तर्क के बजाय (जैसा संभवतः संभव था)।

इस प्रकार

let john (x, y) : (float * float) = y;; 

मतलब यह है कि john का परिणाम है (यानी, y) प्रकार (float * float) का होना चाहिए। अब, इनपुट में हमारे पास एक जोड़ी है जिसमें x (जिसमें से कुछ भी ज्ञात नहीं है) और y (प्रकार float * float), इनपुट के लिए अंतिम प्रकार 'a * (float * flat) है।

आप क्या चाहते हैं पाने के लिए आपको इस्तेमाल कर सकते हैं:

let john ((x:float), (y:float)) = y;; 
-1

आप सामान्य रूप में OCaml और कार्यात्मक प्रोग्रामिंग जानने के लिए चाहते हैं, Programming Languages पाठ्यक्रम फिर से Coursera में पेश किया जा रहा है। आप एसएमएल, रैकेट और रूबी द्वारा प्रोग्रामिंग भाषा अवधारणाओं को सीखेंगे और आपके द्वारा सीखने के लिए मज़ेदार असाइनमेंट होंगे। अत्यधिक सिफारिशित।

संबंधित मुद्दे