> ... I never understood why (->) is right associative in types, but (=>) is not and you are instead supposed to pack constraints in a tuple.

`-XRankNTypes` enables something called Rank 1 types, which accepts this:

>    foo :: Ord a => Num b => a -> Show b => b
>    -- foo :: (Ord a, Num b, Show b) => a -> b  -- inferred/canonical

We should also have:

>    bar :: forall a. forall {- empty -}. forall b. blah
>    -- bar :: forall a b. blah   -- equivalent

But `PatternSynonyms` drives a cart and horses through that: you must have exactly 2 `... => ... => ...` and exactly 2 `forall`s (possibly empty) -- that is, if you explicitly quantify at all. Or you can go:

>    MyPat :: Num a =>          a -> Baz a      -- which is shorthand for
>    MyPat :: Num a => ()    => a -> Baz a      -- which is equiv to
>    MyPat :: Num a => Num a => a -> Baz a
>    MyPat :: ()    => Num a => a -> Baz a      -- this means something different