<div dir="ltr"><div><div>> 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.<br></div><div><br></div></div><div><div><span style="font-family:arial,sans-serif">Try these diagnostics:</span></div><div><span style="font-family:arial,sans-serif"><br></span></div><div><span style="font-family:arial,sans-serif">--- Diagnostic 1</span></div><div><span style="font-family:arial,sans-serif"><br></span></div><div><span style="font-family:arial,sans-serif">Given that the type of "const" is "a -> b -> a" and the type of "True" is "Bool":</span></div><div><font face="monospace"><br></font></div><div><font face="monospace">:t const</font></div><div><font face="monospace">const :: a -> b -> a</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">:t True</font></div><div><font face="monospace">True :: Bool</font></div><div><font face="monospace"><br></font></div><div><font face="arial, sans-serif">What do you expect the type of "const True" to be?</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">:t const True</font></div><div><font face="monospace">const True :: <what do you think goes here?></font></div><div><ul><li>If you answer "b -> Bool", you are correct, so you may be confused by the data type definition syntax (see below).<br></li><li><span style="font-family:arial,sans-serif">If you answer something else, you may be missing some basic understanding of the type system.</span></li></ul><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">--- Diagnostic 2</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Consider this case:</font></div><div><font face="arial, sans-serif"><br></font></div><div><span style="font-family:monospace">:t id</span><br></div><div><font face="monospace">id :: a -> a</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">:t (id, id)</font></div></div></div><div><font face="monospace">(id, id) :: (a1 -> a1, a2 -> a2)</font></div><div><ul><li><span style="font-family:arial,sans-serif">If you think that the type of "(id, id)" should be "(a -> a, a -> a)", you may be unaware of the implicit universal quantifiers.</span></li></ul><div><font face="arial, sans-serif"><br></font></div></div><div>--- If you are confused by the data type definition syntax:</div><div><br></div><div><font face="monospace">data Either a b</font></div><div><font face="monospace">  = Left a</font></div><div><font face="monospace">  | Right b</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">then, consider the GADT (generalized algebraic data type) definition syntax for saying the same thing:</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="monospace">data Either a b where</font></div><div><font face="monospace">  Left  :: a -> Either a b</font></div><div><font face="monospace">  Right :: b -> Either a b</font></div><div><font face="monospace"><br></font></div><div><span style="font-family:arial,sans-serif">The problem becomes less confusing: </span><span style="font-family:arial,sans-serif">The GADT </span><span style="font-family:arial,sans-serif">definition</span><span style="font-family:arial,sans-serif"> </span><span style="font-family:arial,sans-serif">syntax is screaming that </span><span style="font-family:arial,sans-serif">"Left" is a function like "id", "const", etc.</span></div><div><span style="font-family:arial,sans-serif"><br></span></div><div><span style="font-family:arial,sans-serif">---</span></div><div><span style="font-family:arial,sans-serif"><br></span></div><div><font face="arial, sans-serif">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).</font></div></div>