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

参考文献

英語を読めない人,読みたくない人に捧ぐ


  1. この説明は説明になってないけども詳しい話は別記事でするよ(実際難しい) 

  2. 今3秒で考えた訳なのでこういう訳だよってのがあれば教えてください