2009-12-20 12 views
9

ओकैम भाषा विनिर्देश में, एक छोटा सा अनुभाग है:ओकंपल प्रकार 'ए। 'ए ->' मतलब है?

poly-typexpr ::= typexpr 
       | { ' ident }+ . typexpr 

टेक्स्ट में कोई स्पष्टीकरण नहीं है, और poly-typexpr का एकमात्र उदाहरण विधि प्रकार को परिभाषित करने में है:

method-type ::= method-name : poly-typexpr 

यह अनुमति देता है मुझे करना है

उत्तर

12

poly-typexpr को रिकॉर्ड फ़ील्ड के प्रकार के रूप में भी अनुमति दी जाती है (Section 6.8.1 देखें)। इन्हें आमतौर पर "अस्तित्व के प्रकार" कहा जाता है, हालांकि some debate on that point है। इस तरह से एक polymorphic प्रकार का उपयोग प्रकार चर के दायरे को बदलता है। उदाहरण के लिए, प्रकार की तुलना:

type 'a t = { f : 'a -> int; } 
type u = { g : 'a. 'a -> int; } 

t वास्तव में प्रकार के एक परिवार, 'a के प्रत्येक संभव मूल्य के लिए एक है। 'a t के प्रत्येक मान में f फ़ील्ड 'a -> int के साथ फ़ील्ड होना चाहिए। उदाहरण के लिए:

# let x = { f = fun i -> i+1; } ;; 
val x : int t = {f = <fun>} 
# let y = { f = String.length; } ;; 
val y : string t = {f = <fun>} 

तुलना में, u एक ही प्रकार है। u के प्रत्येक मान के साथ 'a के लिए g के साथ फ़ील्ड होना चाहिए। उदाहरण के लिए:

# let z = { g = fun _ -> 0; } ;; 
val z : u = {g = <fun>} 

यहाँ ध्यान दें कि g बिल्कुल अपने इनपुट के प्रकार पर निर्भर नहीं करता है; अगर ऐसा होता है, तो इसमें 'a. 'a -> int टाइप नहीं होगा। उदाहरण के लिए:

# let x2 = { g = fun i -> i+1; } ;; 
This field value has type int -> int which is less general than 'a. 'a -> int