(~) 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:
-
splitTildehandles~, 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
splitTildeto 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 |