4. Release notes for version 8.6.1¶
The significant changes to the various parts of the compiler are listed in the following sections. There have also been numerous bug fixes and performance improvements over the 8.4.1 release.
4.1. Highlights¶
The highlights, since the 8.4.1 release, are:
- Programs are no longer constrained by the Windows
MAX_PATHfile path length limit. The file path limit is now approximately 32,767 characters. Note that GHC itself is still somewhat limited due to GCC not supporting file namespaced paths. Paths that are passed directly to the compiler, linker or other GNU tools are currently still constrained. See File paths under Windows for details. - Many, many bug fixes.
4.2. Full details¶
4.2.1. Language¶
Use of quantified type variables in constraints is now allowed via the
QuantifiedConstraintslanguage extension. This long-awaited feature enables users to encode significantly more precision in their types. For instance, the commonMonadTranstypeclass could now make the expectation that an applied transformer is must be aMonadclass (forall a. Monad m => Monad (t m)) => MonadTrans t where {- ... -}
Additionally, quantification can enable terminating instance resolution where this previously was not possible. See Quantified constraints for details.
A new
DerivingVialanguage extension has been added which allows the use of theviaderiving strategy. For instance:newtype T = MkT Int deriving Monoid via (Sum Int)
See Deriving via for more information.
A new
StarIsTypelanguage extension has been added which controls whether*is parsed asData.Kind.Typeor a regular type operator.StarIsTypeis enabled by default.GHC now permits the use of a wildcard type as the context of a standalone
derivingdeclaration with the use of thePartialTypeSignatureslanguage extension. For instance, this declaration:deriving instance _ => Eq (Foo a)
Denotes a derived
Eq (Foo a)instance, where the context is inferred in much the same way as ordinaryderivingclauses do. See Partial Type Signatures.Data declarations with empty
whereclauses are no longer valid without the extensionGADTSyntaxenabled. For instance, consider the following,data T where
The grammar is invalid in Haskell2010. Previously it could be compiled successfully without
GADTs. As of GHC 8.6.1, this is a parse error.Incomplete patterns warning
-Wincomplete-patternsis extended to guards in pattern bindings andifalternatives ofMultiWayIf. For instance, consider the following,foo :: Bool -> Int foo b = if | b -> 1
In GHC 8.6.1, it will raise the warning:
<interactive>:2:12: warning: [-Wincomplete-patterns] Pattern match(es) are non-exhaustive In a multi-way if alternative: Guards do not cover entire pattern space
See Trac #14773.
Scoped type variables now work in default methods of class declarations and in pattern synonyms in Template Haskell. See Trac #14885.
doexpressions, lambda expressions, etc. to be directly used as a function argument, enabled withBlockArguments. See More liberal syntax for function arguments for the full details.Underscores in numeric literals (e.g.
1_000_000), enabled withNumericUnderscores. See Numeric underscores for the full details.CUSKs now require all kind variables to be explicitly quantified. This was already the case with
TypeInType, but nowPolyKindsalso exhibits this behavior. This means that the following example is no longer considered to have a CUSK:data T1 :: k -> Type -- No CUSK: `k` is not explicitly quantified
Functionality of
TypeInTypehas been subsumed byPolyKinds, and it is now merely a shorthand forPolyKinds,DataKinds, andNoStarIsType. The users are advised to avoidTypeInTypedue to its misleading name: theType :: Typeaxiom holds regardless of whether it is enabled.GHC has become more diligent about catching illegal uses of kind polymorphism. For instance, GHC 8.4 would accept the following without the use of
PolyKinds:f :: forall k (a :: k). Proxy a f = Proxy
This is now an error unless
PolyKindsis enabled.The plugin mechanism has been extended to allow plugins to run between frontend phases. Of particular note are the parser and typechecker plugins which run after parsing and typechecking have completed. Collectively, these new extension points are called source plugins.
Type literals now could be used in type class instances without the extension
FlexibleInstances.See Trac #13833.
4.2.2. Compiler¶
- GHC now no longer adds the current file’s directory as a general include path
calling the C compiler. Instead we use
-iquoteto only add it as an include path for #include “”. See Trac #14312. - GHC now supports British spelling of
GeneralizedNewtypeDeriving. - GHC now does significantly more constant folding in its core-to-core optimiser. This will result in significantly better code being generated for some programs. See Trac #9136.
- GHC now offers significantly more information about typed holes such as valid hole fits and refinement hole fits. See Valid Hole Fits for more information.
- The code-generation effects of
-dynamiccan now be enabled independently by the flag-fexternal-dynamic-refs. If you don’t know why you might need this, you don’t need it. -Wcompatnow includes-Wimplicit-kind-varsto provide early detection of breakage that will be caused by implementation of GHC proposal #24 in a future release.
4.2.3. Plugins¶
GHC’s plugin mechanism now offers plugin authors control over their plugin’s effect on recompilation checking. Specifically the
Pluginrecord name has a new fielddata Plugin = Plugin { pluginRecompile :: [CommandLineOption] -> IO PluginRecompile , {- ... -} } data PluginRecompile = ForceRecompile | NoForceRecompile | MaybeRecompile Fingerprint
Plugin based on
defaultPluginwill have their previous recompilation behavior (ForceRecompile) preserved. However, plugins that are “pure” are encouraged to override this to eitherNoForceRecompileorMaybeRecompile. See Controlling Recompilation for details.GHC now provides a class of new plugins: source plugins. These plugins can inspect and modify a variety of intermediate representations used by the compiler’s frontend. These include:
- The ability to modify the parser output
- The ability to inspect the renamer output
- The ability to modify the typechecked AST
- The ability to modify Template Haskell splices
- The ability to modify interface files as they are loaded
See Source plugins for details.
4.2.5. Runtime system¶
- The GHC runtime linker now prefers user shared libraries above system ones.
When extra search directories are specified these are searched before anything
else. This fixes
iuucon Windows given the proper search directories (e.g-L/mingw64/lib). - The GHC runtime linker now uses
LIBRARY_PATHand the runtime loader now also searchesLD_LIBRARY_PATH. - The GHC runtime on Windows is no longer constrained by the
MAX_PATHfile path length limitation. See File paths under Windows. - The runtime now allows use of the
-hTprofiling variety on programs built with-prof. - The STM assertions mechanism (namely the
alwaysandalwaysSucceedsfunctions) has been removed. This happened a bit earlier than proposed in the deprecation pragma included in GHC 8.4, but due to community feedback we decided to move ahead with the early removal.
4.2.6. Template Haskell¶
4.2.7. ghc library¶
4.2.8. base library¶
($!)is now representation-polymorphic like($).- The module
Data.Functor.Contravarianthas been moved from thecontravariantpackage intobase. All the other modules incontravariant(Data.Functor.Contravariant.Divisible, etc.) have not been moved tobase, and they still reside incontravariant.
4.2.9. ghc-prim library¶
- Version number 0.5.2.1 (was 0.5.2.0)
- Added new
addWordC#operation for unsigned addition with carry.
4.2.10. Build system¶
4.3. Included libraries¶
The package database provided with this distribution also contains a number of packages other than GHC itself. See the changelogs provided with these packages for further change information.
| Package | Version | Reason for inclusion |
|---|---|---|
| ghc | 8.7 | The compiler itself |
| Cabal | 2.4.0.0 | Dependency of ghc-pkg utility |
| Win32 | 2.6.1.0 | Dependency of ghc library |
| array | 0.5.2.0 | Dependency of ghc library |
| base | 4.12.0.0 | Core library |
| binary | 0.10.0.0 | Dependency of ghc library |
| bytestring | 0.10.8.2 | Deppendency of ghc library |
| containers | 0.6.0.1 | Dependency of ghc library |
| deepseq | 1.4.4.0 | Dependency of ghc library |
| directory | 1.3.3.0 | Dependency of ghc library |
| filepath | 1.4.2.1 | Dependency of ghc library |
| ghc-boot | 8.7 | Internal compiler library |
| ghc-compact | 0.1.0.0 | Core library |
| ghc-prim | 0.5.3 | Core library |
| ghci | 8.7 | The REPL interface |
| haskeline | 0.7.4.3 | Dependency of ghci executable |
| hpc | 0.6.0.3 | Dependency of hpc executable |
| integer-gmp | 1.0.2.0 | Core library |
| mtl | 2.2.2 | Dependency of Cabal library |
| parsec | 3.1.13.0.0.0.0.0 | Dependency of Cabal library |
| process | 1.6.3.0 | Dependency of ghc library |
| template-haskell | 2.14.0.0 | Core library |
| text | 1.2.3.0 | Dependency of Cabal library |
| time | 1.8.0.2 | Dependency of ghc library |
| transformers | 0.5.5.0 | Dependency of ghc library |
| unix | 2.8.0.0 | Dependency of ghc library |
| xhtml | 3000.2.2.1 | Dependency of haddock executable |