目次
既知のHaskell処理系はどれもそうだが、GHCもいくつかの言語拡張を実装している。これらは、コマンド行フラグやプラグマを使って有効/無効を切り替えられる。デフォルトでGHCが理解するのは、対応しているうちで最新のHaskellに、多少の拡張を加えたものである。
グラスゴー拡張の中には、Haskellを実装するのに使われている基礎となる機能に触れるようにするものがある。よって、可搬性のないコードを原始的な水準で書くつもりがあるなら、生の部分を操作することができる。効率を追求するとき、Haskellの高水準な機能の実装コストのせいで行き詰まる必要はない。常にそれらの機能の「下」でコードを書けるからである。極端な場合、速度が重要な部分は全てCで書き、それをあとでHaskellと合わせる、ということもできる。
最低水準での作業に没頭する(例えば、至るところでMutableByteArray#
を使ったり)前に、必要な機能に「Haskellらしい被覆」を被せるライブラリがないか確かめた方が良いだろう。ライブラリ説明書(訳注: 未訳。web上の最新版)にはGHC付属のライブラリが全て説明されている。
言語オプションのフラグは、言語のどの変種が許されるか制御するものである。
言語オプションは二つの方法で制御できる。
全ての言語オプションは"-X...
"というコマンド行フラグ(例えば-XTemplateHaskell
)によって有効に、"-XNo...
"というフラグ(例えば-XNoTemplateHaskell
)によって無効にできる。
Cabalが認識する言語オプションなら、LANGUAGE
プラグマを使って有効にすることもできる。{-# LANGUAGE TemplateHaskell #-}
のように。(7.13.1. LANGUAGEプラグマを見よ)
-fglasgow-exts
フラグは、以下の拡張を有効にするのと同じである。-XForeignFunctionInterface
、-XUnliftedFFITypes
、-XImplicitParams
、-XScopedTypeVariables
、-XUnboxedTuples
、-XTypeSynonymInstances
、-XStandaloneDeriving
、-XDeriveDataTypeable
、-XDeriveFunctor
、-XDeriveFoldable
、-XDeriveTraversable
、-XDeriveGeneric
、-XFlexibleContexts
、-XFlexibleInstances
、-XConstrainedClassMethods
、-XMultiParamTypeClasses
、-XFunctionalDependencies
、-XMagicHash
、-XPolymorphicComponents
、-XExistentialQuantification
、-XUnicodeSyntax
、-XPostfixOperators
、-XPatternGuards
、-XLiberalTypeSynonyms
、-XRankNTypes
、-XTypeOperators
、-XDoRec
、-XParallelListComp
、-XEmptyDataDecls
、-XKindSignatures
、-XGeneralizedNewtypeDeriving
。
-fglasgow-exts
の効果は、これらのオプションを有効にすることだけである。我々はこの多目的フラグをやめて、機能を個別に有効にする方向に移行しようとしている。