Tôi hoàn toàn bối rối bằng cách quan sát hành vi này trong # mã F của tôi, đây được lấy từ một phiên tương tác:Tại sao ngoặc quan trọng trong F # khai báo kiểu
Microsoft (R) F# 2.0 Interactive build 4.0.40219.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
For help type #help;;
> type foo = Foo of (string * int);;
type foo = | Foo of (string * int)
> let f = Foo ("bar",42);;
val f : foo = Foo ("bar", 42)
> match f with Foo x -> x;;
val it : string * int = ("bar", 42)
> type bar = Bar of string * int;;
type bar = | Bar of string * int
> let b = Bar ("baz",21);;
val b : bar = Bar ("baz",21)
> match b with Bar x -> x;;
match b with Bar x -> x;;
-------------^^^^^
stdin(7,14): error FS0019: This constructor is applied to 1 argument(s) but expects 2
>
Có vẻ như rõ ràng với tôi rằng mô hình kết hợp trên cả hai Foo và Bar với một biến duy nhất nên hợp lệ - vì vậy tôi đã tự hỏi nếu có ai biết lý do cho hành vi khủng khiếp này, hoặc nếu bạn thích tôi coi nó là một lỗi.
Cập nhật: Chỉ cần làm rõ, các loại báo cáo của các nhà thầu Foo
và Bar
là:
> Foo;;
val it : string * int -> foo = <fun:[email protected]>
> Bar;;
val it : string * int -> bar = <fun:[email protected]>
Vì vậy, chắc chắn, họ phải chấp nhận cùng một tập các mẫu hợp lệ
Cảm ơn bạn đã trả lời rất kỹ lưỡng, thậm chí chỉ ra phần có liên quan của đặc tả ngôn ngữ! Nhưng tôi sợ rằng bây giờ tôi coi nó là một quái vật nghiêm trọng hơn, bây giờ nó đã được cố ý! :-) – plc
@plc - Tôi dự đoán rằng lý do cho sự khác biệt là kiểm soát ranh giới giữa các ngôn ngữ khác như C#. Trong trường hợp đó, bạn có thể quan tâm nếu bạn cần tạo một thể hiện DU bằng cách truyền vào một bộ dựng sẵn hoặc bằng cách truyền vào các thành phần riêng lẻ. – kvb