2015-10-02 12 views
7

पर विचार करें मैं दो अलग अलग पुस्तकालय प्रकार है:इनलाइन समारोह और प्रकार विस्तार

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

मैं सामान्य समारोह zoo है कि या तो Foo या Bar उदाहरण के लिए काम करेंगे लागू करना चाहते हैं। और मैं Foo और Bar नहीं बदल सकता क्योंकि वे लाइब्रेरी कोड का हिस्सा हैं।

// 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' 

क्यों नहीं इनलाइन समारोह परिभाषा प्रकार एक्सटेंशन पर निर्भर करता है:

यहाँ मेरी पहली प्रकार एक्सटेंशन और इनलाइन समारोह का उपयोग कर के रूप में समझाया here प्रयास है? प्रारंभिक Foo और Bar प्रकार परिभाषाओं को बदलने के बिना मैं अपनी समस्या को कैसे हल कर सकता हूं?

उत्तर

11

विधि अधिभार का उपयोग करें।

विस्तार विधियों के साथ समस्या यह है कि solving member constraints पर उन्हें ध्यान में नहीं रखा जाता है।

तो आप विधि अधिभार का उपयोग कर सकते हैं, जैसा कि पहले से ही आपके उत्तर में दिखाया गया है या आप आगे बढ़ सकते हैं और इंटरमीडिएट प्रकार और इंटरमीडिएट विधि (इस मामले में सादगी के लिए ऑपरेटर) का उपयोग करके इनलाइन जेनेरिक फ़ंक्शन बना सकते हैं। चाल:

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" } 

यहाँ आप more details यह कैसे काम करता है।

ध्यान रखें कि यह फ़ंक्शन रेखांकित किया जाएगा, इसलिए उदाहरण के लिए आप इसे सी # से कॉल नहीं कर पाएंगे, यदि यह आवश्यक है तो फ़ंक्शन का उपयोग न करें, सरल और मानक विधि ओवरलोड का उपयोग करें।

1

सबसे अच्छी बात मैं अब तक मिल सकता है

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" 

है यह सबसे अच्छा है और बहुत सामान्य नहीं समाधान नहीं है लेकिन कम से कम यह काम करता है।

संबंधित मुद्दे