Edited at

GHC言語拡張の一覧

More than 1 year has passed since last update.

Haskellのデファクトスタンダードな処理系であるGHCには,Haskellの言語仕様を補うような形で,GHC拡張と呼ばれる言語拡張を用意している.これらはちょっとした便利な糖衣構文を用意するようなものから型システムに深刻な影響を及ぼすもの,次期仕様策定までの前準備のものまで様々ある.いくつかの拡張はデフォルトで有効になっている.

言語拡張は,次の3つの方法で制御できる.


  • すべての言語オプションは,コマンドラインフラグ-X ...(たとえば,-XTemplateHaskell)でオンになり、フラグ -XNo ...でオフになる.(たとえば,-XNoTemplateHaskell

  • GHCによって認識されている言語オプションは,LANGUAGEプラグマ(たとえば,{-# LANGUAGE TemplateHaskell #-})を使用して有効にすることもできる.

  • stack (hpack) を使っていれば,package.yamlのdefault-extensionで有効にすることもできる.1(パッケージごと)

以下は使用可能な言語拡張の一覧である.(GHC8.6.12に準拠)

各言語拡張の詳しい説明,何が嬉しいか,どういうときに使われるかは随時別記事として追加していく.


拡張一覧

有効な拡張だけで締めて121個.多すぎ.

拡張
説明

AllowAmbiguousTypes
ユーザが曖昧な型を書くのを許し,型推論エンジンからそれらが推論されるようにする.

AlternativeLayoutRule
レイアウトルールを別のものに変更する

AlternativeLayoutRuleTransitional
AlternativeLayoutRuleのHaskell98向け

ApplicativeDo
Applivcative do-notationを脱糖衣できるようにする

Arrows
Arrow notationを有効にする

AutoDeriveTypeable
Typeable型クラスのインスタンスをderiving宣言がなくてもderivingする

BangPatterns
bang patternsを有効にする

BinaryLiterals
2進数リテラルを使用可能にする

BlockArguments
do, case, if, let, mdo, procを関数適用する際に()を省略できるようにする3

CApiFFI
CAPIの呼び出しを可能にする

ConstrainedClassMethods
型クラスのメソッドに型制約を書けるようにする

ConstraintKinds
制約種を有効にする

CPP
Cプリプロセッサを使えるようにする

DataKinds
データ型を昇格し種にできるようにする

DatatypeContexts
データ型の宣言に型クラス制約を書けるようにする

DefaultSignatures
型クラスのメソッドの型シグネチャのデフォルトを提供できるようにする

DeriveAnyClass
任意のクラスのderivingを可能にする

DeriveDataTypeable
Typeable型クラスのderivingを可能にする

DeriveFoldable
Foldable型クラスのderivingを可能にする

DeriveFunctor
Functor型クラスのderivingを可能にする

DeriveGeneric
Generic型クラスのderivingを可能にする

DeriveLift
Lift型クラスのderivingを可能にする

DeriveTraversable
Traversable型クラスのderivingを可能にする

DerivingStrategies
deriving戦略を指定できるようにする

DisambiguateRecordFields
レコードフィールドの曖昧さを許す

DoAndIfThenElse
do内でif-then-else式が書けるようになる.Haskell98向け 

DoRec
(非推奨) 再帰的なdo notationを許す.RecursiveDoに統合された

DuplicatedRecordFields
同じ名前のフィールドを持つレコードの定義を許す

EmptyCase
空のCase式を許す

EmptyDataDecls
空のデータ型の定義を許す

EmptyDataDeriving
空のデータ型にderiving宣言を書けるようにする

ExistentialQuantification
存在型の型シノニムを導入する

ExplicitForAll
全称量化子の明示を可能にする

ExplicitNamespaces
キーワードtypeを用いて,importおよびexportのエントリの名前空間(値または型)を明示的に指定できるようにする

ExtendedDefaultRules
通常のモジュールでGHCiの拡張デフォルト規則を使用できるようににする

ExtensibleRecords
拡張可能レコードを使えるようにする

FlexibleContexts
型クラス宣言において,型引数を複数持つ型クラス制約を書けるようにする

FlexibleInstances
インスタンス宣言において,型引数を複数持つ型クラス制約を書けるようにする

ForeignFunctionInterface
FFIを有効にする

FunctionalDependencies
型クラス宣言において,関数従属を扱えるようにする

GADTs
一般代数データ型を有効にする

GADTSyntax
GADTs風の記法使えるようにする

GeneralizedNewtypeDeriving
newtypeされた型のderivingを可能にする

Generics
削除された

GHCForeignImportPrim
C--で書かれたGHCのプリミティブ演算をHaskellファイルにインポート可能にする

HexFloatLiterals
16進数浮動小数点数リテラルを使用可能にする

ImplicitParams
暗黙のパラメータを有効にする

ImplicitPrelude
Preludeを暗黙でインポートする

ImpredicativeTypes
多相型を受け取れる多相型(Impredicative type)を使えるようにする

IncoherentInstances
Incoherentなインスタンスを有効にする4

InstanceSigs
インスタンス宣言で型シグネチャを書けるようにする

InterruptibleFFI
割り込み可能なFFIを有効にする

JavaScriptFFI
JavaScriptをFFIできるようにする

KindSignatures
Kindシグネチャを書けるようにする

LambdaCase
λ式チックにcase式を書けるようにする

LiberalTypeSynonyms
型シノニムの宣言の制限を緩める

MagicHash

#を識別子の後置修飾子として許す

MonadComprehensions
モナド内包表記を使用可能にする

MonadFailDesugaring
doの脱糖衣においてMonadFailを使用する

MonoLocalBinds
ローカル束縛の一般化を禁止する

MonomorphismRestriction
単相性制限を無効にする

MultiParamTypeClasses
型クラス宣言において,型引数を複数取れるようにする

MultiWayIf
multi-way-if記法を有効にする

NamedFieldPuns
レコードのフィールド名に対する略記を使えるようにする

NamedWildCards
型シグネチャでのワイルドカードの名前付けを許す

NegativeLiterals
負数リテラルを有効にする

NewQualifiedOperators
削除された

NondecreasingIndentation
do式のインデントルールを緩和する(Haskell98向け)

NPlusKPatterns
n+kパターンをサポートする

NullaryTypeClasses
型引数なしの型クラス宣言を許す.MultiPramTypeClassesに統合された.

NumericUnderscores

_で数値リテラルを区切れるようにする3

NumDecimals
浮動小数点数リテラルの値が整数の場合に整数として扱う

OverlappingInstances
overlapping instancesを有効にする1

OverloadedLabels
オーバーロードされたラベルを有効にする

OverloadedLists
オーバーロードされたリストを有効にする

OverloadedStrings
オーバーロードされた文字列リテラルを有効にする

PackageImports
パッケージを修飾付きインポートできるようにする

ParallelArrays
並列処理向けの配列の構文をサポートする

ParallelListComp
リストの並行内包表記をできるようにする

PartialTypeSignatures
ワイルドカードを使った型シグネチャを許す

PArr
削除された

PatternGuards
パターンガードを有効にする(デフォルトで有効)

PatternSignatures
(非推奨) 型シグネチャをパターンに書けるようにする.ScopedTypeVariablesに統合された

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
型族を使用可能にする

TypeFamilyDependencies
型族従属を使用可能にする5

TypeInType
明示的な種変数の量化,高階種, 種多相,種シノニム,種族などの機能を有効にし,型と同じように種を扱えるようにする

TypeOperators
型演算子を使用可能にする

TypeSynonymInstances
インスタンスの型シノニムを使用可能にする

UnboxedSums
Unbox化された直和を使用可能にする

UnboxedTuples
Unbox化されたタプルを使用可能にする

UndecidableInstances
決定不能な可能性もあるすべてのインスタンスを許す

UndecidableSuperClasses
決定不能な可能性もあるすべての親クラス制約を許す

UnicodeSyntax
Unicode記法を使用可能にする

UnliftedFFITypes
外部言語の型をUnbox化された型として使用可能にする

Unsafe
Safe HaskellをUnsafeモードにする

ViewPatterns
Viewパターンを有効にする

XmlSyntax

Haskell Server Pages拡張言語従って,具体的なXML構文を式とパターンで扱えるようにする


-fglasgow-exts

-fglasgow-extsフラグを使用すると,以下の拡張が全て有効になる.(なお廃止予定)


  • ConstrainedClassMethods

  • DeriveDataTypeable

  • DeriveFoldable

  • DeriveFunctor

  • DeriveGeneric

  • DeriveTraversable

  • EmptyDataDecls

  • ExistentialQuantification

  • FlexibleContexts

  • FlexibleInstances

  • ForeignFunctionInterface

  • FunctionalDependencies

  • GeneralizedNewtypeDeriving

  • ImplicitParams

  • KindSignatures

  • LiberalTypeSynonyms

  • MagicHash

  • MultiParamTypeClasses

  • ParallelListComp

  • PatternGuards

  • PostfixOperators

  • RankNTypes

  • RecursiveDo

  • ScopedTypeVariables

  • StandaloneDeriving

  • TypeOperators

  • TypeSynonymInstances

  • UnboxedTuples

  • UnicodeSyntax

  • UnliftedFFITypes


分類

とりあえず適当に分類してみた.

異議申し立て絶賛受付中


記法の拡張,制限


  • AlternativeLayoutRule

  • AlternativeLayoutRuleTransitional (Haskell98)

  • ApplicativeDo

  • Arrows

  • BlockArguments

  • DoAndIfThenElse (Haskell98)

  • DoRec (非推奨)

  • EmptyCase

  • EmptyDataDecls

  • ExplicitNamespaces

  • GADTSyntax

  • LambdaCase

  • MonadComprehensions

  • MonadFailDesugaring

  • MonoLocalBinds

  • MultiWayIf

  • NamedWildCards

  • NondecreasingIndentation (Haskell98)

  • ParallelListComp

  • PartialTypeSignatures

  • PostfixOperators

  • QuasiQuotes

  • RecursiveDo

  • StandaloneDeriving

  • StaticPointers

  • TransformListComp

  • TupleSections

  • UnicodeSyntax

  • XmlSyntax


パターンマッチ


  • NPlusKPatterns

  • PatternGuards

  • PatternSignatures (非推奨)

  • PatternSynonyms

  • RegularPatterns

  • View Patterns


リテラル


  • BinaryLiterals

  • HexFloatLiterals

  • NegativeLiterals

  • NumericUnderscores

  • NumDecimals

  • OverloadedStrings


レコード


  • DisambiguateRecordFields

  • DuplicatedRecordFields

  • ExtensibleRecords

  • NamedFieldPuns

  • OverloadedLabels

  • RecordWildCards

  • TraditionalRecordSyntax


制限の緩和


  • AllowAmbiguousTypes

  • GADTs

  • ImplicitParams

  • ImpredicativeTypes

  • LiberalTypeSynonyms

  • MonomorphismRestriction

  • RebindableSyntax

  • RelaxedPolyRec

  • ScopedTypeVariables


型クラス


  • ConstrainedClassMethods

  • DatatypeContexts

  • DefaultSignatures

  • FlexibleContexts

  • FlexibleInstances

  • FunctionalDependencies

  • IncoherentInstances

  • InstanceSigs

  • MultiParamTypeClasses

  • NullaryTypeClasses

  • OverlappingInstances

  • TypeSynonymInstances

  • UndecidableInstances

  • UndecidableSuperClasses


量化


  • ExistentialQuantification

  • ExplicitForAll



  • ConstraintKinds

  • DataKinds

  • KindSignatures

  • PolyKinds

  • Rank2Types

  • RankNTypes

  • TypeInType


型,型族


  • ExplicitNamespaces

  • TypeApplications

  • TypeFamilies

  • TypeFaimilyDependencies

  • TypeOperators


deriving可能な型クラス, データ型の拡張


  • AutoDeriveTypeable

  • DeriveAnyClass

  • DeriveDataTypeable

  • DeriveFoldable

  • DeriveFunctor

  • DeriveGeneric

  • DeriveLift

  • DeriveTraversable

  • DerivingStrategies

  • EmptyDataDeriving

  • GeneralizedNewtypeDeriving


Unbox


  • MagicHash

  • UnboxedSums

  • UnboxedTuples


Template Haskell


  • TemplateHaskell

  • TemplateHaskellQuotes


FFI


  • CApiFFI

  • ForeignFunctionInterface

  • InterruptibleFFI

  • JavaScriptFFI

  • UnliftedFFITypes


Safe


  • Safe

  • Trustworthy

  • Unsafe


正格


  • BangPatterns

  • Strict

  • StrictData


その他


  • CPP

  • ExtendedDefaultRules

  • GHCForeignImportPrim

  • ImplicitPrelude

  • OverloadedLists

  • PackageImports

  • ParallelArrays

  • RestrictedTypeSynonyms

  • RoleAnnotations


参考文献

不足や間違いなどあればコメントで指摘お願いします.

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





  1. cabalも同様に{project名}.cabalのdefault-extensionで有効にできる. 



  2. 喜べ,こいつは次のメジャーリリースだぞ 



  3. GHC8.6.1以降で利用可能 



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



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