1
GHCにおける自動専門化の推移性
GHC 7.6 のドキュメントから: そもそも、SPECIALIZEプラグマは必要ないことがよくあります。モジュールMをコンパイルすると、GHCのオプティマイザー(-O付き)は、Mで宣言された各トップレベルのオーバーロード関数を自動的に考慮し、Mで呼び出されるさまざまな型に特化します。オプティマイザーは、インポートされた各INLINABLEオーバーロード関数も考慮します。 Mで呼び出されるさまざまな型に特化しています。 そして さらに、関数fにSPECIALIZEプラグマが指定されると、GHCは、それらがSPECIALIZEプラグマと同じモジュールにある場合、またはINLINABLEである場合、fによって呼び出されるすべての型クラスオーバーロード関数の特殊化を自動的に作成します。など、推移的に。 したがって、GHCはプラグマなしでマークされた一部/ほとんど/すべての(?)関数を自動的に特殊化する必要があります。明示的なプラグマを使用すると、特殊化は推移的です。私の質問は、自動専門化は推移的ですか?INLINABLE 具体的には、ここに小さな例があります: Main.hs: import Data.Vector.Unboxed as U import Foo main = let y = Bar $ Qux $ U.replicate 11221184 0 :: Foo (Qux Int) (Bar (Qux ans)) = iterate (plus y) y !! 100 in putStr $ show $ foldl1' (*) ans …