(~) and (!) are parsed inconsistently in types (plus documentation warts)
(Spawned from #10056 (closed)?replyto=41##15457 (closed))
~
and !
are slightly special in the parser to allow strict annotations and lazy annotations (with -XStrict
) in data types. As a result, we initially parse all uses of ~
/!
as bangs, and we use a post-parsing pass (mergeOps
/splitTilde
) to figure out which uses of ~
are actually meant to refer to the equality type constructor.
There's a couple of unsatisfying things here:
-
splitTilde
handles~
, but not!
. This means that any use of!
as a type operator will not work, as evidenced by this GHCi session:
λ> type a ! b = Either a b
<interactive>:1:6: error:
Malformed head of type or class declaration: a !b
We should update
splitTilde
to handle!
as well. (And perhaps give that function a new name to reflect its more ambitious goals.)
-
Note [Parsing ~]
is supposed to explain all of this hullabaloo, but it does a rather poor job of it. Let's add some more prose to it.
Trac metadata
Trac field | Value |
---|---|
Version | 8.4.3 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (Parser) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |