diff options
Diffstat (limited to 'docs/users_guide')
| -rw-r--r-- | docs/users_guide/8.6.1-notes.rst | 3 | ||||
| -rw-r--r-- | docs/users_guide/glasgow_exts.rst | 8 | ||||
| -rw-r--r-- | docs/users_guide/using-warnings.rst | 31 |
3 files changed, 35 insertions, 7 deletions
diff --git a/docs/users_guide/8.6.1-notes.rst b/docs/users_guide/8.6.1-notes.rst index 72a3790bfd..3a24384493 100644 --- a/docs/users_guide/8.6.1-notes.rst +++ b/docs/users_guide/8.6.1-notes.rst @@ -51,8 +51,7 @@ Language - A new :extension:`StarIsType` language extension has been added which controls whether ``*`` is parsed as ``Data.Kind.Type`` or a regular type operator. - :extension:`StarIsType` is enabled by default and disabled by - :extension:`TypeOperators`. + :extension:`StarIsType` is enabled by default. - GHC now permits the use of a wildcard type as the context of a standalone ``deriving`` declaration with the use of the diff --git a/docs/users_guide/glasgow_exts.rst b/docs/users_guide/glasgow_exts.rst index 14d01f6123..5cf5c583ad 100644 --- a/docs/users_guide/glasgow_exts.rst +++ b/docs/users_guide/glasgow_exts.rst @@ -8712,8 +8712,7 @@ Kind polymorphism .. extension:: TypeInType :shortdesc: Deprecated. Enable kind polymorphism and datatype promotion. - :implies: :extension:`PolyKinds`, :extension:`DataKinds`, :extension:`KindSignatures`, - :extension:`NoStarIsType` + :implies: :extension:`PolyKinds`, :extension:`DataKinds`, :extension:`KindSignatures` :since: 8.0.1 In the past this extension used to enable advanced type-level programming @@ -9160,13 +9159,12 @@ The kind ``Type`` ----------------- .. extension:: StarIsType - :shortdesc: Desugar ``*`` to ``Data.Kind.Type``. + :shortdesc: Treat ``*`` as ``Data.Kind.Type``. :since: 8.6.1 Treat the unqualified uses of the ``*`` type operator as nullary and desugar - to ``Data.Kind.Type``. Disabled by :extension:`TypeOperators` and - :extension:`TypeInType`. + to ``Data.Kind.Type``. The kind ``Type`` (imported from ``Data.Kind``) classifies ordinary types. With :extension:`StarIsType` (currently enabled by default), ``*`` is desugared to diff --git a/docs/users_guide/using-warnings.rst b/docs/users_guide/using-warnings.rst index 575e28119f..8d09b4488b 100644 --- a/docs/users_guide/using-warnings.rst +++ b/docs/users_guide/using-warnings.rst @@ -34,6 +34,7 @@ generally likely to indicate bugs in your program. These are: * :ghc-flag:`-Wtabs` * :ghc-flag:`-Wunrecognised-warning-flags` * :ghc-flag:`-Winaccessible-code` + * :ghc-flag:`-Wstar-binder` The following flags are simple ways to select standard "packages" of warnings: @@ -1169,6 +1170,36 @@ of ``-W(no-)*``. since we're passing ``Foo1`` and ``Foo2`` here, it follows that ``t ~ Char``, and ``u ~ Int``, and thus ``t ~ u`` cannot hold. +.. ghc-flag:: -Wstar-binder + :shortdesc: warn about binding the ``(*)`` type operator despite + :ghc-flag:`-XStarIsType` + :type: dynamic + :reverse: -Wno-star-binder + + Under :ghc-flag:`-XStarIsType`, a ``*`` in types is not an operator nor + even a name, it is special syntax that stands for ``Data.Kind.Type``. This + means that an expression like ``Either * Char`` is parsed as ``Either (*) + Char`` and not ``(*) Either Char``. + + In binding positions, we have similar parsing rules. Consider the following + example :: + + {-# LANGUAGE TypeOperators, TypeFamilies, StarIsType #-} + + type family a + b + type family a * b + + While ``a + b`` is parsed as ``(+) a b`` and becomes a binding position for + the ``(+)`` type operator, ``a * b`` is parsed as ``a (*) b`` and is rejected. + + As a workaround, we allow to bind ``(*)`` in prefix form:: + + type family (*) a b + + This is a rather fragile arrangement, as generally a programmer expects + ``(*) a b`` to be equivalent to ``a * b``. With :ghc-flag:`-Wstar-binder` + we warn when this special treatment of ``(*)`` takes place. + .. ghc-flag:: -Wsimplifiable-class-constraints :shortdesc: 2arn about class constraints in a type signature that can be simplified using a top-level instance declaration. |
