2017-05-15 9 views
5

मैं एक पैटर्न मैचइसका मतलब क्या है जब ओकैम वैरिएबल `#` से शुरू होता है? (हैश साइन/पाउंड साइन)?

| {call_name = #bundle_source; _ }

source

कोड में इससे पहले, bundle_source एक प्रकार (type bundle_source = ...) के रूप में परिभाषित किया गया है में इस पार कैम।

तो हैश चिह्न का क्या अर्थ है? पैटर्न मिलान में {call_name = #bundle_source } का अर्थ है कि call_name का मान bundle_source टाइप करने की उम्मीद है?

मैंने "हैश साइन" और "पाउंड साइन" के लिए the manual खोजा लेकिन कुछ भी नहीं मिला।

उत्तर

7

यह पैटर्न बनाने के लिए एक शॉर्टेंड है जो पॉलिमॉर्फिक वैरिएंट मानों के संग्रह से मेल खाता है।

प्रलेखन OCaml मैनुअल की Section 6.6 में है: (`tag-name1(_ : typexpr1) | … | ` tag-namen(_ : typexprn)): प्रकार [('a,'b,…)] typeconstr = [ ` tag-name1 typexpr1 | … | ` tag-namen typexprn] परिभाषित किया गया है

है, तो पैटर्न #typeconstr निम्नलिखित या पैटर्न के लिए एक आशुलिपि है। यह [< typeconstr ] प्रकार के सभी मानों से मेल खाता है।

# type b = [`A | `B];; 
type b = [ `A | `B ] 
# let f x = 
    match x with 
    | #b -> "yes" 
    | _ -> "no";; 
val f : [> b ] -> string = <fun> 
# f `A;; 
- : string = "yes" 
# f `Z;; 
- : string = "no" 

(मैं या तो इस अंकन से परिचित नहीं था।)

1

पैटर्न में #typeconstr के उपयोग के पूरक, एक प्रकार अभिव्यक्ति #class-path में के रूप में वर्ग #class_path की एक उप-प्रकार इंगित करता है। उदाहरण के लिए,

class c = object method m =() end 
class d = object inherit c method n =() end 
let f (x:c) =() 
let g (x:#c) =() 

कॉल के साथ f (new d) (c की आ उपवर्ग है विफल रहता है

Error: This expression has type d but an expression was expected of type c. 
The second object type has no method n 

f के बाद से साथ बिल्कुल प्रकार c की एक वस्तु की उम्मीद है, जबकि g (new d)d के बाद प्रकार-जांचकर्ता द्वारा स्वीकार किया जाता है ध्यान दें कि `जी (ऑब्जेक्ट विधि एम =() अंत) भी स्वीकार किया जाएगा)।

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