2011-09-03 25 views
12

Đối với một hàm nội tuyến có thể tạo ra một hạn chế như thành viên:mẫu tích cực và hạn chế

let inline implicit arg = 
    (^a : (static member op_Implicit : ^b -> ^a) arg) 

đòi hỏi các nhà điều hành nhất định hoặc thành viên trên các đối số. Có cách nào để phù hợp dựa trên somthing tương tự?

Tôi muốn tạo một mẫu đang hoạt động trong đó bất kỳ đối số nào được chuyển đến phương thức khớp với ràng buộc của hàm được chèn vào như trình kích hoạt ở trên và chức năng và mọi thứ khác kết thúc như một phần của quản lý lỗi.

Trả lời

28

Dường như bạn cũng có thể viết các mẫu hoạt động nội tuyến. Tôi đã không sử dụng điều này trước đây, nhưng tôi đã thử nó ngay bây giờ và nó có vẻ hoạt động tốt. Các mô hình Test dưới đây có thể được sử dụng với bất kỳ đối tượng mà thực hiện Test phương thức trả về option<^R>:

let inline (|Test|_|) (a:^T) : option<^R> = 
    (^T : (member Test : unit -> option<^R>) a) 

Bây giờ bạn có thể xác định một số đối tượng mà xác định Test phương pháp và kết hợp chúng bằng cách sử dụng mẫu:

type A() = 
    member x.Test() = Some(10) 

match new A() with 
| Test(n) -> printfn "%d" n 
| _ -> printfn "failed" 

này trông giống như một kỹ thuật rất thú vị, bởi vì khớp mẫu bây giờ là một phần của đối tượng.

0

Tôi nghĩ bạn sẽ phải sử dụng sự phản chiếu, ví dụ: Có chức năng mất o:obj và sau đó phản ánh trên các thành viên của o.GetType().

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