2011-01-14 23 views
15

Đố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?

Trả lời

23

Nó không viết rõ ràng ràng buộc là vấn đề, đó là cú pháp không đẹp đến nỗi bạn có thể đặt một ràng buộc thành viên vào một tham số và sau đó gọi thành viên theo cách thông thường. Phần nội dung của walk_the_creaturewalk_the_creature2 sẽ là như nhau ở đây:

let inline walk_the_creature_2 (creature:^a when ^a:(member Walk : unit -> unit)) = 
    (^a : (member Walk : unit -> unit) creature) 
+0

Ô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? –

+10

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). –

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