2017-05-15 50 views
5

I krzywka całej to w dopasowania wzorcaCo to znaczy, gdy zmienna OCaml zaczyna się od `# '? (znak hash/znak funta)?

| {call_name = #bundle_source; _ }

source

Wcześniej kodzie bundle_source jest definiowany jako rodzaj (type bundle_source = ...).

Co oznacza znak skrótu? Czy {call_name = #bundle_source } w dopasowaniu wzorca oznacza, że ​​wartość call_name ma mieć typ bundle_source?

Szukałem the manual "znaku hash" i "znaku funta", ale nic nie znalazłem.

Odpowiedz

7

Jest to skrót do konstruowania wzorców, które pasują do zbioru odmian polimorficznych.

dokumentacja jest Section 6.6 instrukcji OCaml:

Jeżeli typ [('a,'b,…)] typeconstr = [ ` tag-name1 typexpr1 | … | ` tag-namen typexprn] jest określona, ​​wtedy wzór #typeconstr jest skrótem dla następujących or-wzoru: (`tag-name1(_ : typexpr1) | … | ` tag-namen(_ : typexprn)). Pasuje do wszystkich wartości typu [< 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" 

(nie był zaznajomiony z tym zapisie zarówno).

1

Jako uzupełnienie stosowania #typeconstr w kierunkach, w wyrażeniu typu #class-path oznacza podtyp klasy #class_path. Na przykład, z

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

połączeń f (new d) powiedzie się z

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

od f oczekuje obiekt typu c dokładnie, natomiast g (new d) jest akceptowana przez typ sprawdzania od d aa podklasę c (zwróć uwagę, że "g" (metoda meta m =() koniec) również byłaby akceptowana).