INLINE Pragma与类型组合

时间:2012-03-28 20:37:33

标签: haskell ghc

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

instance Functor (IResult t) where
    fmap = fmapR
    {-# INLINE fmap #-}

1 个答案:

答案 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