Release notes for version 7.10.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 7.8 branch.
Highlights
The highlights, since the 7.8 branch, are:
TODO FIXME
Full detailsLanguage
There is a new extension,
StaticPointers,
which allows you to create pointers to expressions which
remain valid across processes. This is useful for
referencing higher-order values in distributed
systems. The pointers are created with a new keyword
static as in
x = static ("abc" ++ "123") :: StaticPtr String.
All processes which dereference x get the
same result, that is, the body of the static form.
Added support for binary integer literals
Simplified rules for implicit quantification. In previous versions of GHC,
it was possible to use the => arrow
to quantify over type variables in data and
type declarations without a
forall quantifier. For example,
data Fun = Fun (Ord a => a -> b) was identical to
data Fun = Fun (forall a b. Ord a => a -> b), while
data Fun = Fun (a -> b) caused a not-in-scope error.
This implicit quantification is now deprecated, and variables
in higher-rank constructors should be quantified with forall
regardless of whether a class context is present or not.
GHC 7.10 raises a warning (controlled by
, enabled by default)
and GHC 7.12 will raise an error. See examples
in GHC documentation.
The change also applies to Template Haskell splices such as
[t|Ord a => a|], which should be written as
[t|forall a. Ord a => a|].
Compiler
GHC now checks that all the language extensions required for
the inferred type signatures are explicitly enabled. This
means that if any of the type signatures inferred in your
program requires some language extension you will need to
enable it. The motivation is that adding a missing type
signature inferred by GHC should yield a program that
typechecks. Previously this was not the case.
This is a breaking change. Code that used to compile in the
past might fail with an error message requiring some
particular language extension (most likely
, or
).
warning flag is turned on by
default with this release of GHC. It can be suppressed
either by using GHC_OPTIONS pragma or by
specifying flag.
A new warning flag,
has been added and is turned on with
. It warns when a module that is
compiled with is actually
infered as an module. This lets the
module author know that they can tighten their Safe Haskell
bounds if desired.
The and
that warn if a module was
infered as Safe or Unsafe have been improved to work with
all Safe Haskell module types. Previously, they only worked
for unmarked modules where the compiler was infering the
modules Safe Haskell type. They now work even for modules
marked as or
. This is useful either to have
GHC check your assumptions, or to generate a list of
reasons easily why a module is regarded as Unsafe.
For many use cases, the new
flag is better
suited than either of these two.
and
flags have been removed.
Many more options have learned to respect the .
For example you can use with
to produce a
for each file that uses Template Haskell.
This should be much easier to understand on a larger project
than having everything being dumped to stdout.
Compiler plugins (with the
flag) may now modify the behaviour of the constraint
solver, to add new functionality to GHC's
typechecker. See
for more details.
A new warning flag,
has been added. The behavior is similar to
but GHC will only
flag exported values. This flag takes precedence over
so it can be used
in conjunction with .
GHCi
TODO FIXME
Template Haskell
Added support for generating LINE pragma declarations
().
The type Pred (which stores a type
constraint) is now a synonym for Type,
in order to work with the ConstraintKinds
extension. This is a breaking change and may require
some rewriting of Template Haskell code.
Pattern splices now work.
reifyInstances now treats unbound type
variables as univerally quantified, allowing lookup of, say,
the instance for Eq [a].
More kind annotations appear in reified types, in order to
disambiguate types that would otherwise be ambiguous in the
presence of PolyKinds. In particular, all
reified TyVarBndrs are now
KindedTVs. (This does not affect Template
Haskell quotations, just calls to reify.)
Various features unsupported in quotations were previously
silently ignored. These now cause errors.
Lift instances were added for
() and Ratio.
All Template Haskell datatypes now have
Generic and Ord instances.
Two new declaration forms are now supported:
standalone-deriving declarations and generic method
signatures (written using default in
a class). This means an expansion to the Dec
type.
Template Haskell is now more pedantic about splicing in
bogus variable names, like those containing whitespace. If you
use bogus names in your Template Haskell code, this may break
your program.
Runtime system
The linker API is now thread-safe. The main
user-facing impact of this change is that you must
now call initLinker before
calling loadObj or any of the
other linker APIs.
Build systemghc-pkg now respects
and when modifying packages (e.g.
changing exposed/trust flag or unregistering). Previously,
ghc-pkg would ignore these flags and modify
whichever package it found first on the database stack. To
recover the old behavior, simply omit these flags.
ghc-pkg accepts a
flag which allows a user to override the location of the user package
database. Unlike databases specified using ,
a user package database configured this way respects
the flag.
Package system
TODO: cover module renaming, thinning, re-export etc
ghc-pkg (and ghc) have dropped support for single-file style
package databases. Since version 6.12, ghc-pkg has defaulted
to a new database format (using a directory of files, one per
package plus a binary cache).
This change will not affect programs and scripts that use
ghc-pkg init to create package databases.
This will affect scripts that create package databases
using tricks like
echo "[]" > package.conf
Such scripts will need to be modified to use
ghc-pkg init, and to delete databases
by directory removal, rather than simple file delete.
Librariesarray
Version number XXXXX (was 0.5.0.0)
base
Version number XXXXX (was 4.7.0.0)
GHC has had its internal Unicode database for
parsing updated to the Unicode 7.0 standard.
Attempting to access a portion of the result of
System.IO.hGetContents that was not yet
read when the handle was closed now throws an exception.
Previously, a lazy read from a closed handle would simply
end the result string, leading to silent or delayed
failures.
bin-package-db
This is an internal package, and should not be used.
binary
Version number XXXXX (was 0.7.1.0)
bytestring
Version number XXXXX (was 0.10.4.0)
Cabal
Version number XXXXX (was 1.18.1.3)
containers
Version number XXXXX (was 0.5.4.0)
deepseq
Version number XXXXX (was 1.3.0.2)
directory
Version number XXXXX (was 1.2.0.2)
filepath
Version number XXXXX (was 1.3.0.2)
ghc
Many internal functions in GHC related to package IDs have been
renamed to refer to package keys, e.g. PackageId
is now PackageKey, the wired-in names
such as primPackageId are now
primPackageKey, etc. This reflects a distinction
that we are now making: a package ID is, as before, the user-visible
ID from Cabal foo-1.0; a package key is now
a compiler-internal entity used for generating linking symbols, and
may not correspond at all to the package ID. In
particular, there may be multiple package keys per
package ID.
The ghc library no longer depends on the Cabal library. This means
that users of the ghc library are no longer forced to use the same
version of Cabal as ghc did. It also means that Cabal is freed up
to be able to depend on packages that ghc does not want to depend
on (which for example may enable improvements to Cabal's parsing
infrastructure).
ghc-prim
Version number XXXXX (was 0.3.1.0)
haskell98
Version number XXXXX (was 2.0.0.3)
haskell2010
Version number XXXXX (was 1.1.1.1)
hoopl
Version number XXXXX (was 3.10.0.0)
hpc
Version number XXXXX (was 0.6.0.1)
integer-gmp
Version number XXXXX (was 0.5.1.0)
old-locale
Version number XXXXX (was 1.0.0.6)
old-time
Version number XXXXX (was 1.1.0.2)
process
Version number XXXXX (was 1.2.0.0)
template-haskell
Version number XXXXX (was 2.9.0.0)
time
Version number XXXXX (was 1.4.1)
unix
Version number XXXXX (was 2.7.0.0)
Win32
Version number XXXXX (was 2.3.0.1)
Known bugs
TODO FIXME