> are both straightforward parameterized types, but Maybe doesn't give me a type parameter back, while Either does, and in different order, different names (a becomes b; b becomes a) depending on which variable I invoke.

Try these diagnostics:

--- Diagnostic 1

Given that the type of "const" is "a -> b -> a" and the type of "True" is "Bool":

:t const
const :: a -> b -> a

:t True
True :: Bool

What do you expect the type of "const True" to be?

:t const True
const True :: <what do you think goes here?>
  • If you answer "b -> Bool", you are correct, so you may be confused by the data type definition syntax (see below).
  • If you answer something else, you may be missing some basic understanding of the type system.

--- Diagnostic 2

Consider this case:

:t id
id :: a -> a

:t (id, id)
(id, id) :: (a1 -> a1, a2 -> a2)

--- If you are confused by the data type definition syntax:

data Either a b
  = Left a
  | Right b

then, consider the GADT (generalized algebraic data type) definition syntax for saying the same thing:

data Either a b where
  Left  :: a -> Either a b
  Right :: b -> Either a b

The problem becomes less confusing: The GADT definition syntax is screaming that "Left" is a function like "id", "const", etc.

---

If you're still unsure, try thinking aloud here: Write your expectations and why you think so (your thought process, what steps you took to arrive at your expectations).