2009-10-01 8 views
9

मुझे आश्चर्य हुआ कि उपयोगकर्ता द्वारा परिभाषित वर्ग रूट फ़ंक्शन (वर्ग) को इस तरह से लिखना संभव है कि यह F # के unit system के साथ ठीक से इंटरैक्ट करता है।यूनिट-सुरक्षित वर्ग जड़ें

यह कैसा होना चाहिए:

 
let sqrt (x : float<'u^2>) = 
    let x' = x/1.0<'u^2> // Delete unit 
    (x ** 0.5) * 1.0<'u>  // Reassign unit 

लेकिन इस की अनुमति नहीं है की वजह से अशून्य स्थिरांक सामान्य इकाइयों रखने की अनुमति नहीं जा रहा है।

क्या इस समारोह को लिखने का कोई तरीका है? बिल्टिन sqrt के साथ यह ठीक काम करता है, तो यह क्या जादू करता है?

+1

संबंधित प्रश्न: (@kvb द्वारा भी उत्तर दिया गया) http://stackoverflow.com/questions/1398611/f-ununit-reunit-inside-a-function – Benjol

उत्तर

6

nonzero जेनेरिक स्थिरांक की अनुमति देने से इकाइयों के लिए प्रकार प्रणाली की सुरक्षा तोड़ना बहुत आसान हो जाएगा (एंड्रयू केनेडी के papers देखें)। मेरा मानना ​​है कि आपके अंतिम प्रश्न का उत्तर यह है कि sqrt वास्तव में कुछ अर्थों में जादू है कि सामान्य माध्यमों के माध्यम से उस प्रकार के हस्ताक्षर के साथ एक पैरामीट्रिक फ़ंक्शन को परिभाषित करना संभव नहीं होना चाहिए।

हैं:

let sqrt (x : float<'u^2>) = 
    let x' = (float x) ** 0.5 (* delete unit and calculate sqrt *) 
    ((box x') :?> float<'u>) 
6

@kvb सही, अधिक आम तौर पर है: हालांकि, यह (एफ # के वर्तमान संस्करण में कम से कम) बॉक्सिंग और कास्टिंग का लाभ उठा कर आप क्या चाहते करने के लिए संभव है आपके पास एक गैर-इकाई जागरूक एल्गोरिदम है (उदाहरण के लिए आप 'क्यूब रूट' लिखते हैं), और आप इसे इकाइयों को रखना चाहते हैं, आप एल्गोरिदम को सही प्रकार के हस्ताक्षर वाले फ़ंक्शन में लपेट सकते हैं और उदाहरण के लिए उपयोग कर सकते हैं इकाइयों को 'दूर फेंक दें' जैसे वे अंदर आते हैं और बॉक्स-एंड-डाउनकास्ट दृष्टिकोण रास्ते में उपयुक्त इकाइयों को 'वापस जोड़ें' के लिए करते हैं।

आरटीएम रिलीज (बीटा 2 के बाद) में, एफ # में 'एड बैक यूनिट' के लिए आदिम लाइब्रेरी फ़ंक्शन होंगे, क्योंकि बॉक्स-एंड-डाउनकास्ट दृष्टिकोण इन प्राइमेटिव्स की कमी को दूर करने के लिए एक हैक का वर्तमान है भाषा/पुस्तकालय।

+0

धन्यवाद - क्या आप इन नए लाइब्रेरी फ़ंक्शंस (लिंक) का नाम दे सकते हैं? – Dario

+3

उन्हें शायद नाम दिया जाएगा उदा। "वैल इनलाइन फ्लोटविथमेजर: फ्लोट -> फ्लोट <'u>" भाषाप्रिमिटिव मॉड्यूल में। – Brian

+0

और यहां यह है: http://msdn.microsoft.com/en-us/library/ee806527(VS.100).aspx – Benjol

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