2012-03-28 34 views
7

給定以下代碼(從attoparsec庫複製而來)內聯編譯指示可以做什麼?我認爲只有fmapR纔是內聯的,但在其他Functor實例中定義的其他fmap是有意義的。INLINE Pragma與類型組合

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

回答

4

內聯編譯指示將複製函數的內容(在這種情況下fmapR)到其中它被稱爲,如果編譯器可以證明所使用的算符是IResult的位置。

的功能不能在下面的情況下被內聯的,因爲fmap定義是不知道:

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

然而,這裏,已知的是,因爲使用了一定函子,和功能可內聯:

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

啊,所以fmap被「重寫」爲fmapR,但fmapR可能沒有內聯,如果我理解正確? – Long 2012-03-28 22:09:58

+0

@Long - 是的,這是正確的。 – 2012-03-28 22:22:06