2015-01-27 14 views
5

Trong F # tôi có thể sử dụng đối sánh mẫu ở nhiều vị trí khác nhau trong cú pháp.Làm thế nào để hủy cấu trúc một đối số hàm tạo?

Ví dụ:

// Given this type... 
type SingleCaseUnion = | SingleCaseUnion of int 

/// ...I can do this: 
let destructureInFunc (SingleCaseUnion n) = 
    printfn "%d" n 

// ...and this: 
type DestructureInMethod() = 
    member t.M(SingleCaseUnion n) = 
     printfn "%d" n 

Nhưng tôi không thể làm việc ra làm thế nào để làm điều này:

type DestructureInCtor(SingleCaseUnion n) = 
    do printfn "%d" n 

// type DestructureInCtor(SingleCaseUnion n) = 
// ---------------------------------------^ 
// 
// stdin(3,40): error FS0010: Unexpected identifier in type definition. Expected ')' or other token. 

Tôi có cú pháp sai, hoặc làm F # không hỗ trợ mô hình phù hợp với các thông số constructor ?

+0

Mặc dù nó không hoạt động đối với các nhà xây dựng * chính *, các nhà xây dựng khác (thứ cấp) cho phép nó. * (Đăng lại như bình luận từ câu trả lời của tôi trở nên không cần thiết.) * – Vandroiy

Trả lời

5

Không, language spec dứt khoát nói không:

primary-constr-args : attributesopt accessopt (simple-pat, ... , simplepat) 
simple-pat : 
| ident 
| simple-pat : type 

Như đã chỉ ra, nhà thầu phụ được cho phép thông số mô hình kết hợp, nhưng sự khác biệt với các nhà xây dựng chính là mỗi người trong số các thông số của chính vừa là một tham số chức năng một khai báo trường riêng.

Nếu F # là để cho phép mô hình kết hợp ở đây, sẽ có một số mẫu mà sẽ phá vỡ mối quan hệ-one-field một tham số này.

type DestructureInCtor(SingleCaseUnion _) = 
    // doesn't declare a private field 

hay:

type DestructureInCtor((a:int, b:int)) = 
    // declares two private fields? 

Nó không thể tưởng tượng rằng điều này có thể làm việc nhưng tôi đoán mức độ phức tạp của việc cho phép mô hình phù hợp để được mở rộng để cung cấp tờ khai lĩnh vực điều trị lớn hơn lợi ích.

+0

Nhìn vào phần 8.6.1.3 của spec, có vẻ không phải là một mối quan hệ tham số lĩnh vực one-to-one. Các tham số có thể vẫn là cục bộ cho hàm khởi tạo, tùy thuộc vào cách sử dụng của chúng, giống như 'cho' các ràng buộc trong hàm tạo chính. * (Xem ví dụ ở đâu "Các đầu vào y chỉ được sử dụng trong quá trình thi" trong spec) * Cho rằng phần còn lại của các nhà xây dựng chính cho phép mô hình, tôi không hiểu tại sao họ sẽ mang lại quá nhiều phức tạp trong danh sách tham số. – Vandroiy

+0

@Vandroiy Bạn nói đúng rằng nếu một tham số không được sử dụng như một trường, thì không có trường nào được tạo. Nhưng các tham số * này * khác với các tham số hàm thông thường. Đó là lý do tại sao nó sẽ thêm phức tạp để cho phép khớp mẫu ở đây và tôi cho rằng điều này không phải là ưu tiên của nhà thiết kế ngôn ngữ. –

+0

Tôi đang so sánh với các liên kết cho phép thay vì tham số chức năng. Tại sao 'MyType (pattern) =' không được biên dịch thành 'MyType (a) = (newline) cho phép pattern = a'? Dường như không thêm nhiều phức tạp ngay từ cái nhìn đầu tiên. – Vandroiy

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