2011-08-22 18 views
9

तरफ जा रहे है कि क्या हम कोण की तरह unitless अवधारणाओं के लिए मापक इकाई का उपयोग करना चाहिए, मान लीजिए मैं एफ # में degree और radian इकाइयों को परिभाषितमैं माप के एफ # इकाई पर एक्सटेंशन सदस्य को कैसे परिभाषित कर सकता हूं?

type [<Measure>] degree = 
    static member ToRadians (d:float<degree>) : float<radian> = d * (Math.PI * 1.<radian>)/180.0<degree> 
and [<Measure>] radian = 
    static member ToDegrees (r:float<radian>) : float<degree> = r * 180.0<degree>/(Math.PI * 1.<radian>) 

मैं उन्हें अपेक्षाकृत आसानी से की तरह

4.0<degree> |> degree.ToRadians 

ऐसा लगता है उपयोग कर सकते हैं जैसे विस्तार के सदस्य भी आसान होंगे। तो मैं सिर्फ

let d = 4.0<degree> 
let r = d.ToRadians() 

कह सकते हैं लेकिन मैं विस्तार सदस्य स्पष्ट तरीका

type float<degree> with 
    member degrees.ToRadians() = degree.ToRadians(degrees) 

को परिभाषित नहीं कर सकते हैं ... यह मेरे निम्न त्रुटि

error FS0010: Unexpected identifier in type name. Expected infix operator, quote symbol or other token. 

हो जाता है वहाँ एक है एफ # में माप की इकाइयों पर विस्तार सदस्यों के लिए वाक्य रचनात्मक चाल, या सुविधा समर्थित है?

+0

मैं अनुमान लगा रहा हूं कि यह समर्थित नहीं है। मैंने जो भी कोशिश की वह त्रुटि दी: 'घोषणाओं को मापने के लिए केवल स्थिर सदस्य हो सकते हैं'। – Daniel

+1

समस्या यह है कि संकलन के बाद माप प्रकार की जानकारी हटा दी जाती है, इसलिए रनटाइम पर सब कुछ सिर्फ 'फ्लोट' होता है इसलिए एक इंस्टेंस विधि को कॉल करने से –

+1

@jpalmer नहीं लगता है। संकलन विस्तार के दौरान सदस्यों को स्थिर रूप से हल किया जाता है। –

उत्तर

5

एफ # एक्सटेंशन सदस्य सी # एक्सटेंशन सदस्यों से अलग हैं जिसमें आप निर्मित जेनेरिक प्रकारों के एक्सटेंशन को परिभाषित नहीं कर सकते हैं। उदाहरण के लिए, आप seq<'t> पर एक्सटेंशन परिभाषित कर सकते हैं, लेकिन seq<int> नहीं। दूसरे शब्दों में, विस्तार सदस्य वास्तव में स्थिर तरीकों के बजाय प्रकार के सदस्यों की तरह कार्य करते हैं। यह भी प्रकार को मापने के लिए लागू होता है, तो आप float<degree> पर एक विस्तार को परिभाषित नहीं कर सकते, लेकिन आप float<[<Measure>]'u> पर एक विस्तार को परिभाषित कर सकते हैं:

type float<[<Measure>]'u> with 
    member f.Squared() = f * f 

[<Measure>] 
type m 

let area = 2.0<m>.Squared() 

हालांकि, मैं नहीं दिख रहा है कि यह कैसे अपने मामले में आपकी मदद करता है ..

+0

पर संचालन के लिए संकलित किया जाता है जो अच्छी समझ में आता है। वाक्यविन्यास के अलावा इन एक्सटेंशन विधियों को परिभाषित करने से कोई वास्तविक लाभ नहीं है, और वहां कई अन्य अच्छे विकल्प हैं। –

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