(~) and (!) are parsed inconsistently in types (plus documentation warts)
! 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 (
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:
~, 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
!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.