GHC Extensions
GHCの言語拡張多すぎ問題。8.6.2時点で適当に分類してみた。Haskell 2010標準に含まれるものは除いた。
(追記) しばらく追ってなかったが、GHC 9.2で GHC2021 という拡張セットがデフォルトで有効になった。
GHC2021
現在(2021)のGHC Haskellプログラミング環境で、十分に安定していて保守的であり、デフォルトで有効にされていてもよいと考えられる拡張セット。 Haskell98 Haskell2010 のいずれも明示的に有効にされていないときに有効になる。以前は呪文のようにGHC拡張を並べていて有効にする拡張セットを小さく保つのも苦労した記憶があるが、今後は GHC202X セットに含まれないものだけ有効にするかどうか考えれば良いかもしれない。
構文を中心とした利便性の向上。ドキュメントを見てすぐに使っていける。
BangPatterns
BinaryLiterals
EmptyCase
HexFloatLiterals
ImportQualifiedPost
NamedFieldPuns
NamedWildCards
NumericUnderscores
PostfixOperators
TupleSections
TypeOperators
型システム (1)。Haskell標準のやや保守的な制限を取り除くなどの改善よりの拡張。
ConstraintKinds
FlexibleContexts
FlexibleInstances
MultiParamTypeClasses (この拡張自体は単純だが、インスタンス決定の一貫性について FunctionalDependencies が必要になってくる)
ScopedTypeVariables
InstanceSigs
型システム (2)。分類が曖昧だが、こちらは新たな機能を加えているイメージがある拡張。
ExistentialQuantification
KindSignatures
PolyKinds
RankNTypes
StandaloneKindSignatures
TypeApplications
導出 (deriving) 関連
DeriveDataTypeable
DeriveFoldable
DeriveFunctor
DeriveGeneric
DeriveLift
DeriveTraversable
EmptyDataDeriving
GeneralisedNewtypeDeriving (これがデフォルトなのは少し驚き、 DerivingStrategies も参照)
StandaloneDeriving
低レイヤ
ForeignFunctionInterface
GHC2021以外でしばしば使う
構文
LambdaCase
MultiWayIf
ViewPatterns
PatternSynonyms
RecordWildCards
リテラル
NumDecimals
OverloadedLists
OverloadedStrings
型システム (2)
GADTs
TypeFamilies
TypeFamilyDependencies
DataKinds
型クラス
DefaultSignatures
FunctionalDependencies
UndecidableInstances
UndecidableSuperClasses
導出
StandaloneDeriving
DerivingStrategies, GeneralizedNewtypeDeriving, DeriveAnyClass
後ろ2つを使うときは DerivingStrategies を有効にして明示的にしたい
DerivingVia
TH
QuasiQuotes
TemplateHaskell
その他
[No]ImplicitPrelude
CPP (通常のHaskellコードで使う機会は乏しい)
試してない
BlockArguments
NegativeLiterals, LexicalNegation
do
RecursiveDo
ApplicativeDo
QualifiedDo
LiberalTypeSynonyms
PackageImports
PartialTypeSignatures
QuantifiedConstraints
RoleAnnotations
LinearTypes
UnliftedDatatypes
ImpredicativeTypes (元は不安定な機能扱いだったが、GHC 9.2で話が変わったか)
Strict
Strict
StrictData
レコード関連
FieldSelectors (デフォルトで有効、レコードに付随するセレクタ関数を無効にするために発生)
DuplicateRecordFields
OverloadedLabels
OverloadedRecordDot
OverloadedRecordUpdate
低レイヤ
CApiFFI
InterruptibleFFI
MagicHash
StaticPointers
UnboxedSums
UnboxedTuples
Safe
Safe
Trustworthy
Unsafe
使ってない
Arrows
ImplicitParams (型クラスでやろう)
MonadComprehensions
ParallelListComp
RebindableSyntax
TransformListComp
UnicodeSyntax
普段明示的に有効にはしない
GHCの拡張には包含関係のある拡張があり、別の拡張によって自動的に有効になるものがある。
GHC2021でデフォルトで有効なものや別の拡張によって気が付いたら有効になってるものが多い。
ConstrainedClassMethods
DisambiguateRecordFields
ExplicitForAll
ExplicitNamespaces
ExtendedDefaultRules
GADTSyntax
MonoLocalBinds (これは微妙なケースがありそう)
TemplateHaskellQuotes
TypeSynonymInstances
歴史的な理由で存在する
TypeInType (deprecated)
DatatypeContexts (misfeatureと考えられている)
NPlusKPatterns (Haskell 2010で消えた)
NullaryTypeClasses (MultiParamTypeClasses でいい)
Rank2Types (RankNTypes でいい)
デフォルトで有効
MonadFailDesugaring
StarIsType
TraditionalRecordSyntax
/icons/hr.icon
参考
GHC 8.2時点、34個
39個、ただし一部はLatest GHCではデフォルトで有効なものもいくつか