6.1.1. Controlling extensions

Language extensions can be controlled (i.e. allowed or not) in two ways:

  • Every language extension can be switched on by a command-line flag “-X...” (e.g. -XTemplateHaskell), and switched off by the flag “-XNo...”; (e.g. -XNoTemplateHaskell).

  • Language extensions can also be enabled using the LANGUAGE pragma, thus {-# LANGUAGE TemplateHaskell #-} (see LANGUAGE pragma).

Haskell2010

Compile Haskell 2010 language variant. Enables the following language extensions:

  • ImplicitPrelude

  • StarIsType

  • CUSKs

  • MonomorphismRestriction

  • DatatypeContexts

  • TraditionalRecordSyntax

  • EmptyDataDecls

  • ForeignFunctionInterface

  • PatternGuards

  • DoAndIfThenElse

  • RelaxedPolyRec

Haskell98

Compile using Haskell 98 language variant. Enables the following language extensions:

  • ImplicitPrelude

  • StarIsType

  • CUSKs

  • MonomorphismRestriction

  • NPlusKPatterns

  • DatatypeContexts

  • TraditionalRecordSyntax

  • NondecreasingIndentation

Although not recommended, the deprecated -fglasgow-exts flag enables a large swath of the extensions supported by GHC at once.

-fglasgow-exts

The flag -fglasgow-exts is equivalent to enabling the following extensions:

  • ConstrainedClassMethods

  • DeriveDataTypeable

  • DeriveFoldable

  • DeriveFunctor

  • DeriveGeneric

  • DeriveTraversable

  • EmptyDataDecls

  • ExistentialQuantification

  • ExplicitNamespaces

  • FlexibleContexts

  • FlexibleInstances

  • ForeignFunctionInterface

  • FunctionalDependencies

  • GeneralizedNewtypeDeriving

  • ImplicitParams

  • InterruptibleFFI

  • KindSignatures

  • LiberalTypeSynonyms

  • MagicHash

  • MultiParamTypeClasses

  • ParallelListComp

  • PatternGuards

  • PostfixOperators

  • RankNTypes

  • RecursiveDo

  • ScopedTypeVariables

  • StandaloneDeriving

  • TypeOperators

  • TypeSynonymInstances

  • UnboxedTuples

  • UnicodeSyntax

  • UnliftedFFITypes

Enabling these options is the only effect of -fglasgow-exts. We are trying to move away from this portmanteau flag, and towards enabling features individually.