2017-05-15 96 views
5

Ben başlarında kodunda sourceOCaml değişkeni `#` ile başladığında ne anlama gelir? (hash işareti/pound işareti)?

| {call_name = #bundle_source; _ }, bundle_source bir tip (type bundle_source = ...) olarak tanımlanan bir desen maçında bu genelinde cam.

Peki, karma işareti ne anlama geliyor? Kalıp eşleştirmesinde {call_name = #bundle_source } değeri call_name değerinin bundle_source türünde olması bekleniyor mu?

"hash sign" ve "pound sign" için the manual arandım ama hiçbir şey bulamadım.

cevap

7

Bu, bir polimorfik varyant değerleri koleksiyonuyla eşleşen desenler oluşturmak için bir kısa yoldur.

belgeleri OCaml kılavuzun Section 6.6 içinde: (`tag-name1(_ : typexpr1) | … | ` tag-namen(_ : typexprn)): tip [('a,'b,…)] typeconstr = [ ` tag-name1 typexpr1 | … | ` tag-namen typexprn] tanımlanır

, o model #typeconstr aşağıdaki ya da kalıp için bir kısaltmadır. Bu, [< typeconstr ] türündeki tüm değerlerle eşleşir.

# 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" 

bir tür ifade #class-path şablon içinde #typeconstr kullanımının bir tamamlayıcı olarak

1

(I. Ya da bu gösterimde bilgi sahibi değildi) sınıf #class_path bir alt tipini gösterir. f yana

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

tam tip c bir nesne bekler ile g (new d)d beri tip-denetleyici tarafından kabul edilebilirken,

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

çağrı ile f (new d), c aa alt sınıfı (edilir başarısız g (nesne yöntemi m =() sonu) da kabul edilir.