| name | language-extensions |
| description | Haskell language extension and language edition (GHC2024/GHC2021) selection policy. Use when configuring or reviewing Haskell language extensions, cabal default-extensions, or default-language. |
| user-invocable | false |
言語拡張の選択方針
Haskellの言語拡張と、
言語拡張のセットである言語バージョンの選択方針について説明します。
基本の方針
Haskellの言語バージョンは使える場合はGHC2024を使用します。
使えない場合はGHC2021を使用します。
GHC2024で有効になっていなくても、
比較的安全で有用な言語拡張は有効にします。
GHC2021に含まれている拡張
BangPatterns
BinaryLiterals
ConstrainedClassMethods
ConstraintKinds
DeriveDataTypeable
DeriveFoldable
DeriveFunctor
DeriveGeneric
DeriveLift
DeriveTraversable
DoAndIfThenElse
EmptyCase
EmptyDataDecls
EmptyDataDeriving
ExistentialQuantification
ExplicitForAll
FieldSelectors
FlexibleContexts
FlexibleInstances
ForeignFunctionInterface
GADTSyntax
GeneralisedNewtypeDeriving
HexFloatLiterals
ImplicitPrelude
ImplicitStagePersistence
ImportQualifiedPost
InstanceSigs
KindSignatures
MonomorphismRestriction
MultiParamTypeClasses
NamedFieldPuns
NamedWildCards
NoExplicitNamespaces
NumericUnderscores
PatternGuards
PolyKinds
PostfixOperators
RankNTypes
RelaxedPolyRec
ScopedTypeVariables
StandaloneDeriving
StandaloneKindSignatures
StarIsType
TraditionalRecordSyntax
TupleSections
TypeApplications
TypeOperators
TypeSynonymInstances
GHC2024に含まれている拡張
上のGHC2021に加えて、
以下の拡張がGHC2024に含まれています。
DataKinds
DerivingStrategies
DisambiguateRecordFields
ExplicitNamespaces
GADTs
LambdaCase
RoleAnnotations
cabalファイルの設定例
典型的なcabalファイルでの言語バージョンと言語拡張の設定は以下のようになります。
default-language: GHC2024
default-extensions:
ApplicativeDo
BlockArguments
CPP
DefaultSignatures
DerivingVia
DuplicateRecordFields
FunctionalDependencies
LexicalNegation
LinearTypes
MonadComprehensions
MultiWayIf
NegativeLiterals
NoFieldSelectors
NoImplicitPrelude
OverloadedLabels
OverloadedRecordDot
OverloadedStrings
ParallelListComp
PatternSynonyms
QualifiedDo
QuantifiedConstraints
QuasiQuotes
RecordWildCards
RecursiveDo
StrictData
TemplateHaskell
TypeData
TypeFamilies
TypeFamilyDependencies
ViewPatterns
個別の言語拡張ごとの採否方針
各言語拡張を、
- デフォルトで有効にする
- 必要なときだけモジュール単位で有効にする
- 禁止する
かの個別の方針と理由はreference.mdを参照してください。