2011-10-27 12 views
5

Dlaczego to działa dobrze?Używanie otwartych połączeń poza modułem zostało zdefiniowane w

module Account = struct 

type account_type = Current of float | Savings of float 

end 

let sarah = Account.Current 100.0;; 

Podczas gdy ostatnia linia w poniższym przykładzie produkuje Error: syntax error?

module Account = struct 

    type 'a account_type = [> `Current of float | `Savings of float ] as 'a 

end 

let pete = Account.`Current 100.0;; 

To znaczy dlaczego nie mogę używać typu otwartego złącza poza modułem bez otwierania modułu? Powinienem powiedzieć, że znalazłem się, że zmiana ostateczną linię:

open Account;; 
let pete = `Current 100.0;; 

działa dobrze, ale oczywiście jest to uciążliwe, jeśli mogę użyć account_type dużo, lub alternatywnie muszę otworzyć Account na początku dowolnego kodu sekcja, w której jest używany account_type, co oznacza, że ​​poświęcę abstrakcję, którą otrzymam, używając podpisu dla Account
Przeszukałem kilka tutoriali OCaml, a także dokumentację INRIA, i nie mogę znaleźć żadnej wzmianki o jak to robisz.
Czy można uniknąć konieczności otwierania modułu za każdym razem, gdy chcę korzystać z account_type?

Dzięki z góry,

Zach

Odpowiedz

6

W drugim przykładzie, to faktycznie nie trzeba open Account w ogóle, składnia jest tylko `Current 100.0. Tag polimorficznego wariantu nie uczestniczy w żadnym konkretnym typie. Typ `Current to [> `Current ], ten (>) oznacza, że ​​typ jest co najmniej `Current, a ponieważ jest to podzbiór typu akceptowanego przez funkcję, zostanie skompilowany dobrze. Możesz przekazać tę samą wartość wielu funkcjom, które akceptują odmianę polimorficzną o tej samej nazwie. Oczywiście brak jest informacji typu statycznego, a błędy maszynowe i sytuacje mogą stać się dość złożone.

Code Reuse through polymorphic variants mówi o niektórych zaletach i przypadkach użycia dla nich.

5

Polimorficzne stałe wariantów, takie jak `Current, są definiowane globalnie, podobnie jak stałe całkowite. Nie powiedziałbyś, że Account.10 odwołuje się do liczby całkowitej 10 w module Account.

To jest siła (i słabość) wariantów polimorficznych, można ich używać bez definiowania ich (tak jak nie trzeba definiować 10 przed użyciem).

Tak więc, jak mówi nlucaroni, nie trzeba otwierać modułu Account, aby uzyskać dostęp do `Current.

W przeciwieństwie do liczb całkowitych, warianty polimorficzne mogą również przyjmować parametry (jak w twoim `Current 100.0). Jednak liczba parametrów i ich typy nie są stałe i mogą nawet różnić się w przypadku tego samego konstruktora w różnych miejscach kodu. Stąd złożoności wspomniane również przez nlucaroni.

[Notatka dotycząca formatowania: aby uzyskać pojedyncze cytaty w postaci `, które pojawią się w tekście napisanym maszynowo, w konwencji oznaczania należy użyć podwójnych cytatów w celu zawarcia tekstu. Pozostawia to pojedyncze cytaty w tekście. A przynajmniej dla mnie to działa.]

+0

Ah, próbowałem uciec z backtick z backtick, powodując tony zamieszania dla wszystkich zaangażowanych. – nlucaroni

Powiązane problemy