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 think that the type of "(id, id)" should be "(a -> a, a -> a)", you may be unaware of the implicit universal quantifiers. --- 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).