2011-11-02 34 views
5

1) Tôi có một công đoàn mở được định nghĩa như sau:Loại nghĩa với đoàn thể mở

type 'a choice = [> `One | `Other ] as 'a 

sau đó tôi cố gắng xác định một loại choice_list:

type choice_list = choice list 

mà không hoạt động. Làm thế nào để xác định loại mà một hoặc nhiều thành phần là công đoàn mở?

2) Nếu thay vào đó tôi forgo tạo kiểu choice_list, và chỉ sử dụng một choice list, khi tôi cố gắng viết một tuyên bố giao diện/chữ ký sử dụng một danh sách lựa chọn,

val choice_handler : choice list -> int 

trình biên dịch phàn nàn rằng type 'a choice = 'a constraint 'a = [> `One | `Other ] is not included in type infection_state. They have different arities.

Câu hỏi của tôi là, làm cách nào để viết khai báo loại danh sách lựa chọn trong giao diện/chữ ký.

Trả lời

9

Trình biên dịch đang cố gắng cho bạn biết rằng choice là một loại tham số. Ở cấp độ loại, nó có một tính chất của 1. Nói cách khác, bạn cần cung cấp một tham số kiểu. Bạn đã hạn chế các tham số là một subtype của [`One|`Other], nhưng khác hơn là nó có thể là bất kỳ loại:

# ([`One; `Third] : 'a choice list);; 
- : [> `One | `Other | `Third ] choice list = [`One; `Third] 

Nếu bạn muốn xác định một danh sách các lựa chọn, các loại phụ phải đến từ một nơi nào. Ví dụ, nó có phải là một tham số để loại mới:

# type 'a choice_list = 'a choice list;; 
type 'a choice_list = 'a choice list constraint 'a = [> `One | `Other ] 

(Những loại công trình xây dựng có được khôn lanh khá nhanh, trong kinh nghiệm của tôi.)

Các vấn đề liên quan