2012-03-28 28 views
7

次のコード(attoparsecライブラリからコピーされたもの)が与えられた場合、インラインプラグマは何をしますか? fmapRだけがインライン化され、他のFunctorインスタンスで定義されている他のfmapは意味を持ちません。インラインプラグマとタイプクラスの組み合わせ

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

答えて

4

コンパイラが使用されてファンクタでIResultであることを証明できる場合インラインプラグマは、それが呼び出された場所に(この場合fmapRに)機能の内容をコピーします。

f :: Functor f => f Int -> f Float 
f = fmap fromIntegral 

ここで、しかしながら、それは特定のファンクタが使用されているので、知られており、関数ができている:

関数はfmapの定義が知られていないので、以下の場合にインライン化することができません

f :: IResult Int -> IResult Float 
f = fmap fromIntegral 
-- rewritten to: f = fmapR fromIntegral; might be further inlined 
+2

ああ、fmapはfmapRとして「再書込み」されますが、正しく理解すればfmapRはインライン化されない可能性がありますか? – Long

+0

@Long - はい、そうです。 –

関連する問題