鉴于以下代码(从attoparsec库复制),内联编译指示有什么作用?我认为仅内联fmapR
是有意义的,而不是其他Functor实例中定义的其他fmap
。
instance Functor (IResult t) where
fmap = fmapR
{-# INLINE fmap #-}
答案 0 :(得分: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