2011-10-27 10 views
5

Tại sao điều này hoạt động tốt?Sử dụng các công đoàn mở bên ngoài mô-đun được xác định trong

module Account = struct 

type account_type = Current of float | Savings of float 

end 

let sarah = Account.Current 100.0;; 

Trong khi dòng cuối cùng sau đây tạo ra 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;; 

Đó là lý do tại sao tôi không thể sử dụng loại công đoàn mở bên ngoài mô-đun mà không cần mở mô-đun? Tôi nên nói rằng tôi đã phát hiện ra rằng việc thay đổi dòng cuối cùng để:

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

hoạt động tốt, nhưng rõ ràng đây là rườm rà nếu tôi sử dụng account_type rất nhiều, hoặc cách khác, tôi phải mở Account khi bắt đầu bất kỳ mã trong đó account_type được sử dụng, có nghĩa là tôi hy sinh sự trừu tượng mà tôi nhận được bằng cách sử dụng chữ ký cho Account
Tôi đã rà soát thông qua một số hướng dẫn OCaml cũng như tài liệu INRIA và tôi không thể tìm thấy bất kỳ đề cập nào về làm thế nào bạn làm điều này.
Có thể tránh phải mở mô-đun mỗi lần tôi muốn sử dụng account_type không?

Cảm ơn trước,

Zach

Trả lời

6

Trong ví dụ thứ hai, bạn thực sự không cần phải open Account ở tất cả, cú pháp chỉ `Current 100.0 là. Thẻ biến thể đa hình không tham gia vào bất kỳ loại cụ thể nào. Loại `Current[> `Current ], điều này (>) có nghĩa là loại tối thiểu là `Current và vì đó là một tập hợp con thuộc loại được hàm này chấp nhận, nó sẽ biên dịch tốt. Bạn có thể chuyển cùng giá trị đó cho một số hàm chấp nhận biến thể đa hình cùng tên. Tất nhiên, có một thiếu thông tin kiểu tĩnh, và lỗi đánh máy và các tình huống có thể trở nên khá phức tạp.

Code Reuse through polymorphic variants nói về một số lợi thế và trường hợp sử dụng cho chúng.

5

Hằng số biến thể đa hình như `Current được xác định trên toàn cầu, tương tự như hằng số nguyên. Bạn sẽ không nói Account.10 để tham chiếu số nguyên 10 bên trong mô-đun Account.

Đây là sức mạnh (và điểm yếu) của các biến thể đa hình, bạn có thể sử dụng chúng mà không cần định nghĩa chúng (như bạn không phải định nghĩa 10 trước khi sử dụng nó).

Vì vậy, như nlucaroni nói, bạn không phải mở mô-đun Account để truy cập vào `Current.

Không giống như các số nguyên, các biến thể đa hình cũng có thể lấy tham số (như trong số `Current 100.0). Nhưng số lượng tham số và loại của chúng không cố định và thậm chí chúng có thể khác nhau cho cùng một hàm tạo ở các vị trí khác nhau trong mã. Do đó sự phức tạp cũng được đề cập bởi nlucaroni.

[Lưu ý định dạng: để lấy lại các dấu trang duy nhất ` để hiển thị trong văn bản kiểu máy đánh chữ, quy ước đánh dấu là sử dụng các dấu ngoặc kép để đính kèm văn bản. Điều này để lại backquotes duy nhất một mình bên trong văn bản. Hoặc ít nhất nó làm việc cho tôi.]

+0

Ah, tôi đã cố gắng thoát khỏi backtick với một backtick, do đó gây ra tấn nhầm lẫn cho tất cả mọi người tham gia. – nlucaroni