2012-11-30 19 views
7
showInt :: Int -> String 
showInt x = show x 

ऊपर कोड कॉल showInt शब्दकोश गुजर या उसे सीधे समारोह Show Int उदाहरण पर घोषित कॉल करता है?क्या जीएचसी संभव होने पर पॉलिमॉर्फिक इंडिकेशन को हटा देता है?

मेरा मतलब है, क्या जीएचसी संभव होने पर जेनरेट कोड से पॉलीमोर्फिक इंडिकेशन को हटा देता है?

+2

यह अक्सर होता है, जैसा कि हथौड़ा द्वारा दिखाया गया है, और कभी-कभी नहीं। इसलिए, अधिक सामान्य सवाल यह है: "कौन सी परिस्थितियां जीएचसी को उपनगरीय संकेतों को दूर करने से रोकती हैं?" । मुझे विस्तार से जुड़े कुछ स्थितियों में पता है, लेकिन आईआईआरसी में हास्केल 98 में ऐसे मामले भी हैं, शायद पॉलिमॉर्फिक रिकर्सिव फ़ंक्शंस के साथ। –

उत्तर

10

हां।

Foo.showInt :: GHC.Types.Int -> GHC.Base.String 
[... attributes omitted ...] 
Foo.showInt = GHC.Show.$fShowInt_$cshow 

आप देख सकते हैं, यह GHC.Show.$fShowInt_$cshow करने के लिए बस एक सीधा संदर्भ: यह उत्पन्न कोर GHC 7.4.2 का उपयोग कर रहा है।

क्या होता है अगर हम प्रकार हस्ताक्षर हटाने के साथ तुलना करें ताकि अनुमानित प्रकार Show a => a -> String बजाय प्रयोग किया जाता है:

Foo.showInt 
    :: forall a_aop. GHC.Show.Show a_aop => a_aop -> GHC.Base.String 
[... attributes omitted ...] 
Foo.showInt = 
    \ (@ a_aot) ($dShow_aou :: GHC.Show.Show a_aot) (x_a9Z :: a_aot) -> 
    GHC.Show.show @ a_aot $dShow_aou x_a9Z 

यहाँ है, यह एक तर्क $dShow_aou शब्दकोश लेता है और यह एक्सेसर समारोह GHC.Show.show का उपयोग करता को देखने के लिए परिणामी फ़ंक्शन को x_a9Z पर लागू करने से पहले इस शब्दकोश से उपयुक्त फ़ंक्शन।

कम से कम अवधारणा के पहले मामले में क्या होता है, यह है कि चूंकि ठोस प्रकार ज्ञात है, इसलिए जीएचसी उचित उदाहरण शब्दकोश के प्रत्यक्ष संदर्भ को तर्क के रूप में लेने के बजाय प्रत्यक्ष संदर्भ देता है। फिर, एक्सेसर, जो मूल रूप से केवल एक रिकॉर्ड लेबल है, को रेखांकित किया जा सकता है और उचित फ़ंक्शन के प्रत्यक्ष संदर्भ के साथ आप छोड़ दिए गए हैं।

-7

जीएचसी ऐसा नहीं करता है। readibility के लिए एक नया बनाया प्रकार के बारे में सोचो:

type Vector = (Float, Float) 

GHC की तरह एक समारोह से Polymorphicism को हटा चाहते हैं:

(!+!) :: Vector -> Vector -> Vector 
(x1, y1) !+! (x2, y2) = (x1 + x2, y1 + y2) 

प्रकार बन जाएगा:

(!+!) :: (Float, Float) -> (Float, Float) -> (Float, Float) 

समारोह जाहिर है जबकि वेक्टर के विशेष रूप से।

+5

घोषणा 'प्रकार वेक्टर = (फ्लोट, फ्लोट)' का अर्थ है कि प्रकार 'वेक्टर' और प्रकार '(फ्लोट, फ्लोट) 'बिल्कुल वही हैं, और आपके फ़ंक्शन में वेक्टर वेक्टर -> वेक्टर -> वेक्टर दोनों प्रकार हैं 'और प्रकार' (फ्लोट, फ्लोट) -> (फ्लोट, फ्लोट) -> (फ्लोट, फ्लोट) 'क्योंकि उनका मतलब वही है, इसलिए नहीं, यह सही नहीं है। – AndrewC

+3

कोड उत्पन्न करते समय जीएचसी पॉलीमोर्फिक कार्यों को जहां संभव हो, माहिर प्रकारों पर अधिक कुशल संस्करण उत्पन्न करता है। संकेतन को हल करने के लिए इनलाइनिंग का भी उपयोग किया जा सकता है। –