GHC поддерживает несколько редакций языка: Haskell98, Haskell2010, GHC2021 и GHC2024. Каждая редакция языка состоит из набора языковых расширений; помимо них существует множество других расширений, которые пока не входят ни в одну редакцию, но могут быть включены явно.
В настоящее время по умолчанию используется GHC2021, если явно не указана другая редакция языка, — в целях обратной совместимости. Поскольку в более поздних версиях GHC по умолчанию может использоваться другая редакция языка, рекомендуется явно указывать редакцию. Для нового кода рекомендуется использовать GHC2024.
Редакцию языка можно выбрать:
- на уровне пакета, например, с помощью
default-language: GHC2024в файле.cabal; - с помощью флага командной строки с префиксом «
-X...» (например,-XGHC2024); или - для отдельного модуля с помощью прагмы
LANGUAGE, например{-# LANGUAGE GHC2024 #-}.
Выбор редакции языка переопределяет все предыдущие варианты. Отключить редакцию языка нельзя.
Аналогичным образом можно управлять языковыми расширениями — включать или отключать их:
- на уровне пакета, например, с помощью
default-extensions: TemplateHaskellв файле.cabal; - с помощью флагов командной строки: флаг «
-X...» включает расширение (например,-XTemplateHaskell), а флаг «-XNo...» отключает его (например,-XNoTemplateHaskell); - для отдельного модуля с помощью прагмы
LANGUAGE, например{-# LANGUAGE TemplateHaskell #-}или{-# LANGUAGE NoTemplateHaskell #-}.
-
GHC2024 -
- Начиная с:
-
9.10.1
GHC утверждает набор расширений, дополняющих Haskell 2010, для включения по умолчанию. Эти расширения считаются стабильными и консервативными.
Обратите внимание: поскольку GHC2024 включает ряд нестандартизированных расширений, гарантии стабильности для неё несколько слабее, чем, например, для
Haskell2010. Хотя GHC старается не менять семантику этих расширений, такие изменения всё же возможны (например, упрощённое правило subsumption, введённое в GHC 9.0, привело к тому, что GHC стал отклонять некоторые программы, использующиеRankNTypes).Редакция языка
GHC2024включает следующие расширения:
-
GHC2021 -
- Начиная с:
-
9.2.1
Общие замечания о редакциях языка
GHC20xxсм. в разделеGHC2024.Также обратите внимание: из-за небольшого упущения включение этой редакции работает немного иначе, чем включение каждого из составляющих её расширений. В частности, хотя
TypeOperatorsподразумеваетExplicitNamespaces,ExplicitNamespacesне входит вGHC2021. Кроме того, хотяGADTsне входит вGHC2021, сочетанияGADTSyntaxиExistentialQuantificationдостаточно для определения GADT и работы с ними.Редакция языка
GHC2021включает следующие расширения:
-
Haskell2010 -
Компиляция с использованием редакции языка Haskell 2010, определённой в отчёте Haskell 2010. GHC стремится в основном вести себя как компилятор Haskell 2010, но есть несколько известных отклонений от стандарта (см. Стандарты Haskell и Glasgow Haskell: несоответствия языка).
Редакция языка
Haskell2010включает следующие языковые расширения:
-
Haskell98 -
Компиляция с использованием редакции языка Haskell 98, определённой в отчёте Haskell 98. GHC стремится в основном вести себя как компилятор Haskell 98, но есть несколько известных отклонений от стандарта (см. Стандарты Haskell и Glasgow Haskell: несоответствия языка).
Редакция языка
Haskell98включает следующие языковые расширения:
Хотя это и не рекомендуется, устаревший флаг -fglasgow-exts позволяет сразу включить множество расширений, поддерживаемых GHC.
-
-fglasgow-exts -
Флаг
-fglasgow-extsэквивалентен включению следующих расширений:Включение этих параметров — единственный эффект
-fglasgow-exts. Мы стремимся отказаться от этого объединяющего флага и вместо этого включать отдельные возможности по мере необходимости.