inline - how are abs, sign etc implemented in F# -
मैंने पाया कि:
abs -10 abs -10l
पूर्व>दोनों काम तो मुझे आश्चर्य है कि कैसे एफ # इसे लागू किया है और स्रोत कोड में एक खोज की है:
प्रकार AbsDynamicImplTable & lt; 'T & gt; () = ABDynamic x = AbsDynamicImplTable & lt; _ & gt;। X [& lt; CompiledName ("एब्स") & gt;] इनलाइन पेट (x: ^ T) दें: ^ टी = एब्सडायमिक एक्स, ^ ^ T: ^ टी = absImpl x
और मैं इन के साथ भ्रमित हूँ
जैसा कि मुझे
abs
जैसी फ़ंक्शन में पता है, हमें इनपुट के साथ 0 की तुलना करनी होगी, और विभिन्न प्रकारों के लिए अलग-अलग 0 एस हैंधन्यवाद
कैओस पैंडियन द्वारा पोस्ट किए गए कोड में कुछ स्पष्टीकरण जोड़ने के लिए, एफ # फ़ंक्शन जैसे abs
यह है कि वे किसी भी संख्यात्मक प्रकार के साथ काम कर सकते हैं। यह सिर्फ एफ # /। नेट जेनेरिक के उपयोग से व्यक्त करने का कोई रास्ता नहीं है - केवल एक ही समर्थित प्रतिबंध है कि टाइप पैरामीटर एक निश्चित अंतरफलक लागू करता है या एक कन्स्ट्रक्टर होता है, लेकिन संख्यात्मक प्रकारों के लिए कोई बाधा नहीं है।
एफ # भी स्थैतिक बाधाओं का समर्थन करता है (टाइप पैरामीटर ^ a
के बजाय सामान्य 'a
है) और ये इनलाइनिंग का उपयोग करते हुए समय संकलित करने पर संसाधित होते हैं (यह भी बताता है कि फ़ंक्शन के पास क्यों है हो इनलाइन
)। आप LanguagePrimitives
से अंतर्निहित फ़ंक्शन का उपयोग करके स्थिर बाधाओं के साथ अपना फ़ंक्शन लिख सकते हैं जिसमें कई उपयोगी फ़ंक्शंस शामिल हैं जो कुछ बाधाओं की आवश्यकता होती है:
& gt; इनलाइन आधा (संख्या: ^ ए) दें: ^ a = भाषाप्रतिष्ठित। डिविइडबैंट & lt; (^ ए) & gt; संख्या 2 ;; वैल इनलाइन आधा: ^ ए - & gt; ^ A ^ ^: (स्थैतिक सदस्य डिवाइडबीआईआईंट: ^ ए * इंट - & gt; ^ ए) & gt; आधा 42.0 ;; इसे वैल: फ्लोट = 21.0 & gt; आधा 42.0 एफ ;; यह मान: float32 = 21.0f
ध्यान दें कि बाधाओं का अनुमान लगाया गया है - divideByInt
की आवश्यकता है कि प्रकार में dividebyInt
सदस्य है, इसलिए हमारा कार्य एक ही बात की आवश्यकता है (और यह आपके अपने प्रकार के साथ काम करेगा यदि यह भी इस सदस्य का है, जो काफी उपयोगी है!)।
इसके अतिरिक्त, abs
का कार्यान्वयन केवल दो अतिरिक्त ट्रिक्स का उपयोग करता है जो केवल F # लाइब्रेरी में अनुमति है - यह विभिन्न प्रकारों के लिए अलग-अलग कोड (जब इनलाइनिंग के लिए इस्तेमाल किया जाता है) निर्दिष्ट करता है ( जब ^ a: int = ....
का उपयोग करके) और एक फॉलबैक केस जो कि Abs
सदस्य का उपयोग करता है, तो यह किसी भी स्पष्ट रूप से सूचीबद्ध प्रकार या एक प्रकार के साथ काम करेगा Abs
सदस्य एक अन्य चाल retype
फ़ंक्शन है, जो "प्रकार बदलता है", लेकिन इसमें कोई भी कोड नहीं होता है - एकमात्र उद्देश्य कोड प्रकार-जांच करना है, लेकिन यह बहुत असुरक्षित हो सकता है - इसलिए यह केवल एफ # पुस्तकालयों में उपयोग किया जाता है
Comments
Post a Comment