INLINE Pragma与类型组合

Lon*_*ong 7 haskell ghc

鉴于以下代码(从attoparsec库复制),内联编译指示有什么作用?我认为只有fmapR内联才有意义,而不是fmap其他Functor实例中定义的其他内容.

instance Functor (IResult t) where
    fmap = fmapR
    {-# INLINE fmap #-}
Run Code Online (Sandbox Code Playgroud)

dfl*_*str 4

fmapR如果编译器可以证明所使用的函子是 ,则内联编译指示会将函数的内容(在本例中为 )复制到调用它的位置IResult

在以下情况下无法内联该函数,因为 的定义fmap未知:

f :: Functor f => f Int -> f Float
f = fmap fromIntegral
Run Code Online (Sandbox Code Playgroud)

然而,这里是已知的,因为正在使用某个函子,并且该函数可以内联:

f :: IResult Int -> IResult Float
f = fmap fromIntegral
-- rewritten to: f = fmapR fromIntegral; might be further inlined
Run Code Online (Sandbox Code Playgroud)

  • 啊,所以 fmap 被“重写”为 fmapR,但是如果我理解正确的话,fmapR 可能不会被内联? (2认同)