给定以下代码(从attoparsec库复制),内联杂注做什么?我认为只内联fmapR
是有意义的,而不内联在其他Functor实例中定义的其他fmap
。
instance Functor (IResult t) where
fmap = fmapR
{-# INLINE fmap #-}
如果编译器能够证明所使用的函子是IResult
,则内联杂注将把函数的内容(在本例中为fmapR
)复制到调用它的位置。
在以下情况下,函数不能内联,因为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