1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
.. _release-9-2-1:
Version 9.2.1
==============
Language
~~~~~~~~
* :extension:`ImpredicativeTypes`: Finally, polymorphic types have become first class!
GHC 9.2 includes a full implementation of the Quick Look approach to type inference for
impredicative types, as described in in the paper
`A quick look at impredicativity
<https://www.microsoft.com/en-us/research/publication/a-quick-look-at-impredicativity/>`__
(Serrano et al, ICFP 2020). More information here: :ref:`impredicative-polymorphism`.
This replaces the old (undefined, flaky) behaviour of the :extension:`ImpredicativeTypes` extension.
Compiler
~~~~~~~~
- New ``-Wredundant-bang-patterns`` flag that enables checks for "dead" bangs.
For instance, given this program: ::
f :: Bool -> Bool
f True = False
f !x = x
GHC would report that the bang on ``x`` is redundant and can be removed
since the argument was already forced in the first equation. For more
details see :ghc-flag:`-Wredundant-bang-patterns`.
- New ``-finline-generics`` and ``-finline-generics-aggressively`` flags for
improving performance of generics-based algorithms.
For more details see :ghc-flag:`-finline-generics` and
:ghc-flag:`-finline-generics-aggressively`.
- Type checker plugins which work with the natural numbers now
should use ``naturalTy`` kind instead of ``typeNatKind``, which has been removed.
- GHCi's ``:kind!`` command now expands through type synonyms in addition to type
families. See :ghci-cmd:`:kind`.
``ghc-prim`` library
~~~~~~~~~~~~~~~~~~~~
- ``Void#`` is now a type synonym for the unboxed tuple ``(# #)``.
Code using ``Void#`` now has to enable :extension:`UnboxedTuples`.
``ghc`` library
~~~~~~~~~~~~~
- The ``con_args`` field of ``ConDeclGADT`` has been renamed to ``con_g_args``.
This is because the type of ``con_g_args`` is now different from the type of
the ``con_args`` field in ``ConDeclH98``: ::
data ConDecl pass
= ConDeclGADT
{ ...
, con_g_args :: HsConDeclGADTDetails pass -- ^ Arguments; never infix
, ...
}
| ConDeclH98
{ ...
, con_args :: HsConDeclH98Details pass -- ^ Arguments; can be infix
, ...
}
Where: ::
-- Introduced in GHC 9.2; was called `HsConDeclDetails` in previous versions of GHC
type HsConDeclH98Details pass
= HsConDetails (HsScaled pass (LBangType pass)) (XRec pass [LConDeclField pass])
-- Introduced in GHC 9.2
data HsConDeclGADTDetails pass
= PrefixConGADT [HsScaled pass (LBangType pass)]
| RecConGADT (XRec pass [LConDeclField pass])
Unlike Haskell98-style constructors, GADT constructors cannot be declared
using infix syntax, which is why ``HsConDeclGADTDetails`` lacks an
``InfixConGADT`` constructor.
As a result of all this, the ``con_args`` field is now partial, so using
``con_args`` as a top-level field selector is discouraged.
``base`` library
~~~~~~~~~~~~~~~~
- It's possible now to promote the ``Natural`` type: ::
data Coordinate = Mk2D Natural Natural
type MyCoordinate = Mk2D 1 10
The separate kind ``Nat`` is removed and now it is just a type synonym for
``Natural``. As a consequence, one must enable ``TypeSynonymInstances``
in order to define instances for ``Nat``.
|