The Haskell 98 Report
top | back | next | contents | function index


11  プラグマ

プラグマをサポートしたコンパイラがいくつかある。プラグマは 付加的指令やヒントをコンパイラに与えるために使用される。しかし、 これは Haskell 言語そのものの正式な部分ではなく、プログラムの意味を 変えるものではない。この節ではこの既存の仕組みを要約する。実装は いかなるプラグマも考慮する必要はない。しかし、実装はこれを処理する ようになっていないのなら、プラグマを無視しなければならない。 字句としてはプラグマはコメントと看倣される。ただし、囲む構文が {-# #-} であるときは例外である。

11.1  インライン展開

decl -> {-# INLINE qvars #-}
decl -> {-# NOINLINE qvars #-}

INLINE プラグマは指定した変数をそれらが使われている場所で インライン展開するように、コンパイラに指示する。コンパイラはしばしば 自動的に単純な式をインライン展開する。これは NOINLINE プラグマで抑制することができる。

11.2  特化

decl -> {-# SPECIALIZE spec1 , ... , speck #-} (k>=1)
spec -> vars :: type

特化は多重定義された関数のディスパッチにある非効率を回避するために 使用される。たとえば、

factorial :: Num a => a -> a
factorial 0 = 0
factorial n = n * factorial (n-1)
{-# SPECIALIZE factorial :: Int -> Int,
               factorial :: Integer -> Integer #-}

において、パラメータが Int または Interger であるこ とをコンパイラが検出できる factorial の呼出しは多重定義され た数値演算を含まない、factorial の特化バージョンである。


The Haskell 98 Report
top | back | next | contents | function index
December 2002