2012-03-28 4 views
7

निम्नलिखित कोड (अटोपर्सेक लाइब्रेरी से कॉपी) को देखते हुए इनलाइन प्रागमा क्या करता है? मुझे लगता है कि यह केवल fmapR के लिए इनलाइन होने के लिए समझ में आता है, लेकिन अन्य fmap एस अन्य फ़ंक्चर उदाहरणों में परिभाषित नहीं हैं।इनलाइन प्रगामा प्रकार वर्गों के साथ संयोजन में

instance Functor (IResult t) where 
    fmap = fmapR 
    {-# INLINE fmap #-} 

उत्तर

4

इनलाइन pragma स्थान है जहां यह कहा जाता है कि अगर संकलक साबित कर सकते हैं कि functor इस्तेमाल किया जा रहा IResult है (इस मामले fmapR में) समारोह की सामग्री की प्रतिलिपि होगा।

समारोह, निम्नलिखित मामले में inlined नहीं किया जा सकता क्योंकि fmap की परिभाषा नहीं जाना जाता है:,

f :: Functor f => f Int -> f Float 
f = fmap fromIntegral 

यहाँ, तथापि, यह जाना जाता है क्योंकि एक निश्चित functor इस्तेमाल किया जा रहा है, और समारोह कर सकते हैं inlined जा:

f :: IResult Int -> IResult Float 
f = fmap fromIntegral 
-- rewritten to: f = fmapR fromIntegral; might be further inlined 
+2

आह, तो FMAP fmapR के रूप में "फिर से लिखा" है, लेकिन fmapR, inlined नहीं किया जा सकता है, तो मुझे लगता है कि सही ढंग से समझ? – Long

+0

@ लोंग - हाँ, यह सही है। –

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