INLINE Pragma与类型类相结合



给定以下代码(从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

最新更新