Đây là một trong những phần phiền phức của cú pháp OCaml, theo ý kiến của tôi. Mặc dù có vẻ bề ngoài, nhà xây dựng Foo không yêu cầu 2-tuple làm đối số của nó. Nó đòi hỏi, cú pháp, hai giá trị trong dấu ngoặc đơn - nhưng chúng không phải là một bộ tuple. Vì vậy, nó chỉ đơn giản là trường hợp mà t
có loại sai. Cách làm cho tác phẩm này là để nói:
let (a, b) = t in Foo (a, b)
Vấn đề thực sự là dấu ngoặc đơn đang được sử dụng cho hai thứ khác nhau (hoặc vì vậy tôi yêu cầu). Một khi bạn quen với việc này, nó không quá khó để giải quyết.
Sửa: nếu bạn muốn constructor Foo để có một tuple duy nhất, chứ không phải là hai giá trị riêng biệt, bạn có thể định nghĩa nó như thế này:
type foo = Foo of (int * int)
Sau đó, phần còn lại của mã ban đầu của bạn sẽ công việc.
Nguồn
2012-03-19 17:33:55
Dấu ngoặc đơn được sử dụng cho hơn hai thứ! Chúng cũng làm cho ví dụ của OP hoạt động như là nếu anh ta chỉ thay đổi 'type foo = Foo của (int * int)' –
Vâng, tôi đã thêm nó vào phần chỉnh sửa ngay trước khi bạn bình luận (không phải là tôi cần lấy tín dụng hay gì cả :-). –
Cảm ơn bạn đã giải thích! – Ricardo