2015-10-02 21 views
7

Cân nhắc tôi có hai khác nhau thư viện loại:Inline chức năng và kiểu mở rộng

type Foo = { foo : string } 
type Bar = { bar : int32 } 

Tôi muốn thực hiện chức năng chung zoo rằng sẽ làm việc cho một trong hai Foo hoặc Bar trường. Và tôi không thể thay đổi FooBar vì chúng là một phần của mã thư viện.

Đây là nỗ lực đầu tiên của tôi sử dụng phần mở rộng loại hình và chức năng inline như được giải thích here:

// Library.fs 
module Library 

type Foo = { foo : string } 
type Bar = { bar : int32 } 

// Program.fs 
type Foo with 
    static member zoo (f : Foo) = "foo" 

type Bar with 
    static member zoo (b : Bar) = "bar" 

let inline zoo (x : ^t) = 
    (^t : (static member zoo : ^t -> string) x) 

let f = zoo { foo = "1" } // error FS0001: The type 'Foo' does not support the operator 'zoo' 

Tại sao không inline định nghĩa hàm dựa trên phần mở rộng loại? Làm cách nào để giải quyết sự cố của tôi mà không thay đổi các định nghĩa loại FooBar ban đầu?

Trả lời

11

Sử dụng quá tải phương thức.

Vấn đề với phương pháp mở rộng là chúng không được tính đến khi solving member constraints.

Vì vậy, bạn có thể sử dụng quá tải phương thức, như được thể hiện trong câu trả lời của riêng bạn hoặc bạn có thể tiếp tục và tạo một hàm tổng quát nội tuyến bằng cách sử dụng loại trung gian và phương pháp trung gian (trong trường hợp này là toán tử đơn giản) lừa:

type T = T with 
    static member ($) (T, x:Foo) = "foo" 
    static member ($) (T, x:Bar) = "bar" 

let inline zoo x = T $ x 

let f = zoo { foo = "1" } 

Ở đây bạn có more details về cách thức hoạt động. Hãy chú ý rằng chức năng này sẽ được gạch chân, vì vậy, ví dụ bạn sẽ không thể gọi nó từ C#, nếu điều này là bắt buộc, không sử dụng chức năng, sử dụng quá tải phương thức tiêu chuẩn đơn giản và tiêu chuẩn.

1

Điều tốt nhất tôi có thể có được cho đến nay là

type Ext = 
    static member zoo (f : Foo) = "foo" 
    static member zoo (b : Bar) = "bar" 

let f = Ext.zoo { foo = "1" } // "foo" 
let b = Ext.zoo { bar = 2 } // "bar" 

Nó không phải là tốt nhất và giải pháp không phải là rất chung chung nhưng ít nhất nó hoạt động.

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