Haskellのデファクトスタンダードな処理系であるGHCには,Haskellの言語仕様を補うような形で,GHC拡張と呼ばれる言語拡張を用意している.これらはちょっとした便利な糖衣構文を用意するようなものから型システムに深刻な影響を及ぼすもの,次期仕様策定までの前準備のものまで様々ある.いくつかの拡張はデフォルトで有効になっている.
言語拡張は,次の2つの方法で制御できる.
- すべての言語オプションは,コマンドラインフラグ
-X ...
(たとえば,-XTemplateHaskell
)でオンになり、フラグ-XNo ...
でオフになる.(たとえば,-XNoTemplateHaskell
) - Cabalによって認識されている言語オプションは,LANGUAGEプラグマ(たとえば,
{ - #LANGUAGE TemplateHaskell # - }
)を使用して有効にすることもできる. - stackを使っていれば,package.yamlのdefault-extentionで有効にすることもできる.(パッケージごと)
以下は使用可能な言語拡張の一覧である.(GHC8.4.1に準拠)
いくつかの言語拡張が抜けてるので注意(すぐ追加するからしばしおまちを)
各言語拡張の詳しい説明,何が嬉しいか,どういうときに使われるかは随時別記事として追加していく.
拡張 | 説明 |
---|---|
AllowAmbiguousTypes | ユーザが曖昧な型を書くのを許し,型推論エンジンからそれらが推論されるようにする. |
AlternativeLayoutRule | |
AlternativeLayoutRuleTransitional | |
ApplicativeDo | Applivcative do-notationを脱糖衣できるようにする |
Arrows | Arrow notationを有効にする |
AutoDeriveTypables | |
BangPatterns | bang patternsを有効にする |
BinaryLiterals | バイナリのリテラルを使用可能にする |
BlockArguments | |
CApiFFI | CAPIの呼び出しを可能にする |
ConstrainedClassMethods | 型クラスのメソッドに型制約を書けるようにする |
ConstraintKinds | 制約種を有効にする |
CPP | Cプリプロセッサを使えるようにする |
DataKinds | データ型を昇格し種にできるようにする |
DatatypeContexts | データ型の宣言に型クラス制約を書けるようにする |
DefaultSignatures | 型クラスのメソッドの型シグネチャのデフォルトを提供できるようにする |
DefaultAnyClass | 任意のクラスのderivingを可能にする |
DeriveDataTypeable | Typeable型クラスのderivingを可能にする |
DeriveFoldable | Foldable型クラスのderivingを可能にする |
DeriveFunctor | Functor型クラスのderivingを可能にする |
DeriveGeneric | Generic型クラスのderivingを可能にする |
DeriveLift | Lift型クラスのderivingを可能にする |
DeriveTraversable | Traversable型クラスのderivingを可能にする |
DerivingStrategies | deriving戦略を指定できるようにする |
DisambiguateRecordFields | レコードフィールドの曖昧さを許す |
DoAndIfThenElse | |
DoRec | |
DuplicatedRecordFields | 同じ名前のフィールドを持つレコードの定義を許す |
EmptyCase | 空のCase式を許す |
EmptyDataDecls | 空のデータ型の定義を許す |
EmptyDataDeriving | |
ExistentialQuantification | 存在型の型シノニムを導入する |
ExplicitForAll | 全称量化子の明示を可能にする |
ExplicitNamespaces | キーワードtype を用いて,importおよびexportのエントリの名前空間(値または型)を明示的に指定できるようにする |
ExtendedDefaultRules | 通常のモジュールでGHCiの拡張デフォルト規則を使用できるようににする |
ExtensibleRecords | |
FlexibleContexts | 型クラス宣言において,型引数を複数持つ型クラス制約を書けるようにする |
FlexibleInstances | インスタンス宣言において,型引数を複数持つ型クラス制約を書けるようにする |
ForeignFunctionInterface | FFIを有効にする |
FunctionalDependencies | 型クラス宣言において,関数従属を扱えるようにする |
GADTs | 一般代数データ型を有効にする |
GADTSyntax | GADTs風の記法使えるようにする |
GeneralizedNewtypeDeriving | newtypeされた型のderivingを可能にする |
Generics | 削除された |
GHCForeignImportPrim | |
HereDocuments | |
HexFloatLiterals | |
ImplicitParams | 暗黙のパラメータを有効にする1 |
ImplicitPrelude | Preludeを暗黙でインポートしなくなる |
ImpredicativeTypes | Impredicative型を有効にする1 |
IncoherentInstances | Incoherentなインスタンスを有効にする1 |
InstanceSigs | インスタンス宣言で型シグネチャを書けるようにする |
InterruptibleFFI | 割り込み可能なFFIを有効にする |
JavaScriptFFI | |
KindSignatures | Kindシグネチャを書けるようにする |
LambdaCase | λ式チックにcase式を書けるようにする |
LiberalTypeSynonyms | 型シノニムの宣言の制限を緩める |
MagicHash |
# を識別子の後置修飾子として許す |
MonadComprehensions | モナド内包表記を使用可能にする |
MonadFailDesugaring | doにおいてMonadFailの脱糖衣を可能にする |
MonoLocalBinds | ローカル束縛の一般化を禁止する |
MonomorphismRestriction | 単相性制限を無効にする |
MultiParamTypeClasses | 型クラス宣言において,型引数を複数取れるようにする |
MultiWayIf | muti-way-if記法を有効にする |
NamedFieldPuns | レコードのフィールド名に対する略記を使えるようにする |
NamedWildCards | 型シグネチャでのワイルドカードの名前付けを許す |
NegativeLiterals |
(-) を単項演算子とする |
NewQualifiedOperators | 削除された |
NondecreasingIndentation | |
NPlusKPatterns | n+kパターンをサポートする |
NullaryTypeClasses | 型引数なしの型クラス宣言を許す.MultiPramTypeClassesに統合された. |
NumericUnderscores | |
NumDecimals | fractional integerのリテラルを導入する |
OverlappingInstances | overlapping instancesを有効にする1 |
OverloadedLabels | オーバーロードされたラベルを有効にする |
OverloadedLists | オーバーロードされたリストを有効にする |
OverloadedStrings | オーバーロードされた文字列リテラルを有効にする |
PackageImports | パッケージを修飾付きインポートできるようにする |
ParallelArrays | |
ParallelListComp | リストの並行内包表記をできるよにする |
PartialTypeSignatures | ワイルドカードを使った型シグネチャを許す |
PArr | 削除された |
PatternGuards | パターンガードを有効にする(デフォルトで有効) |
PatternSignatures | |
PatternSynonyms | パターンシノニムを有効にする |
PolyKinds | Kind多相を使えるようにする |
PostfixOperators | 後置演算子を使えるようにする |
QuasiQuotes | Template HaskellにおけるQuasi-quotation記法を有効にする |
Rank2Types | ランク2多相を使えるようにする |
RankNTypes | 高階多相を使えるようにする |
RebindableSyntax | 再束縛可能にする構文を使用できるようにする |
RecordWildCards | レコードのワイルドカードを使用可能にする |
RecursiveDo | 再帰的なdo notationを許す |
RegularPatterns | |
RelaxedPolyRec | |
RestrictedTypeSynonyms | |
RoleAnnotations | ロール注釈を有効にする |
Safe | Safe HaskellをSafeモードにする |
SafeImports | 削除された |
ScopedTypeVariables | 字句スコープの型変数を許す |
StandaloneDeriving | deriving宣言を単独で書けるようにする |
StaticPointers | 閉じた式への参照を可能にするstatic構文を書けるようにする |
Strict | 対象のモジュールの束縛をデフォルトで正格にする |
StrictData | 対象のモジュールのデータ型をデフォルトで正格にする |
TemplateHaskell | Template Haskellを有効にする |
TemplateHaskellQuotes | Template Haskellのquotation記法を有効にする |
TraditionalRecordSyntax | レコード記法を有効にする(デフォルトで有効) |
TransformListComp | SQLチックな一般化されたリスト内包表記を有効にする |
Trustworthy | Safe HaskellをTrustworthyモードにする |
TupleSections | タプルのセクションを有効にする |
TypeApplications | Type Application構文を使用可能にする |
TypeFamilies | 型族を使用可能にする |
TypeFaimilyDependencies | 型族従属を使用可能にする2 |
TypeInType | 明示的な種変数の量化,高階種, 種多相,種シノニム,種族などの機能を有効にし,型と同じように種を扱えるようにする |
TypeOperators | 型演算子を使用可能にする |
TypeSynonymInstances | インスタンスの型シノニムを使用可能にする |
UnboxedSums | Unbox化された直和を使用可能にする |
UnboxedTuples | Unbox化されたタプルを使用可能にする |
UndecidableInstances | 決定不能な可能性もあるすべてのインスタンスを許す |
UndecidableSuperClasses | 決定不能な可能性もあるすべての親クラス制約を許す |
UnicodeSyntax | Unicode記法を使用可能にする |
Unsafe | Safe HaskellをUnsafeモードにする |
View Patterns | Viewパターンを有効にする |
XmlSyntax |
-fglasgow-EXTS
-fglasgow-EXTS
フラグを使用すると,以下の拡張が全て有効になる.(なお廃止予定)
- ConstrainedClassMethods
- DeriveDataTypeable
- DeriveFoldable
- DeriveFunctor
- DeriveGeneric
- DeriveTraversable
- EmptyDataDecls
- ExistentialQuantification
- ExplicitNamespaces
- FlexibleContexts
- FlexibleInstances
- ForeignFunctionInterface
- FunctionalDependencies
- GeneralizedNewtypeDeriving
- ImplicitParams
- KindSignatures
- LiberalTypeSynonyms
- MagicHash
- MultiParamTypeClasses
- ParallelListComp
- PatternGuards
- PostfixOperators
- RankNTypes
- RecursiveDo
- ScopedTypeVariables
- StandaloneDeriving
- TypeOperators
- TypeSynonymInstances
- UnboxedTuples
- UnicodeSyntax
- UnliftedFFITypes
参考文献
英語を読めない人,読みたくない人に捧ぐ