给定以下代码(从 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
关于haskell - INLINE Pragma 与类型类相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915271/