Đối với một loạiLàm cách nào để viết ràng buộc thành viên này trong F #?
type Cow() =
class
member this.Walk() = Console.WriteLine("The cow walks.")
end
tôi có thể viết một phương pháp mà thực thi một thành viên chế cho phương pháp Walk như
let inline walk_the_creature creature =
(^a : (member Walk : unit -> unit) creature)
// and then do
walk_the_creature (Cow())
Trong trường hợp này các loại được suy ra. Tôi không thể viết rõ ràng ràng buộc đối với thông số sinh vật như thế này
// Does not compile
// Lookup on object of indeterminate type based on information prior to this
// program point. A type annotation may be needed...
let inline walk_the_creature_2 (creature:^a when ^a:(member Walk : unit -> unit)) =
creature.Walk()
Tôi đang làm gì sai?
Ông có thể giải thích lý do tại sao cơ thể cần phải được viết theo cách này. Không phải tất cả thông tin về loại đã có trong phương pháp thứ hai chưa? –
Hệ thống ràng buộc thành viên khá phức tạp và tách biệt khỏi hệ thống kiểu danh nghĩa, do đó bạn không nhận được cú pháp yêu cầu thành viên danh nghĩa miễn phí. Trong thực tế, '(^ a: (thành viên Walk: unit -> unit) sinh vật)' không gọi bất cứ điều gì, nó là một mẫu để tạo ra một (inlined) loại thực hiện cụ thể của chức năng tại thời gian biên dịch. Tôi cho rằng cú pháp hợp nhất mong muốn có thể được thực hiện, nhưng nhóm F # không bao giờ dự đoán các ràng buộc thành viên trở nên quá phổ biến, chỉ dành cho các thư viện lõi và do đó cú pháp là tổng số xác tàu trong phiên bản này (qua các ngón tay). –