<div>Hi,<br><br>The `(a -> b)` in `map :: (a -> b) -> [a] -> [b]` is a type of function from a type `a` to a type `b`.   Haskell, by default, is using implicit quantification, however using `ScopedTypeVariables` extension you could write `map :: forall a b. (a -> b) -> [a] -> [b]` to make it explicit.  This way you see that both `a` and `b` are introduced by `forall`.  In particular, you can substitute any types, e.g. if you substitute `a` with `Char` and `b` with `Int`, you'll get `map :: (Char -> Int) -> [Char] -> [Int]`.  If you enable `TypeApplication` extension you can do that in `ghci`:  `:t map @Char @Int`  You can read the type of `map` as follows: given a function `f` from type `a` to some type `b`, `map f :: [a] -> [b]`, i.e. `map f` is a function from list of `a` to list of `b`'s.<br><br>Being able to write functions like `map`, is called parametric polymorphism. Using such  polymorphism you guarantee that the implentation of `map` cannot do any thing with `a`'s and `b`'s, as there's no knowledge about what they are, beside the recepe how to transform `a`'s into `b` given by `f`.  This limits what `map f` can do to a list of `a`'s.<br><br>Best regards,<br>Marcin Szamotulski</div><div><br></div><div class="protonmail_quote"><div>‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐<br></div><div> On Friday, December 18th, 2020 at 19:30, Lawrence Bottorff <borgauf@gmail.com> wrote:<br></div></div><div><br></div><blockquote class="protonmail_quote" type="cite">
            <div dir="ltr">I'm looking at this<div><br></div><div><font face="monospace">ghci> :type map<br>map :: (a -> b) -> [a] -> [b]</font><br></div><div><br></div><div>and wondering what the <font face="monospace">(a -> b)</font> part is about. map takes a function and applies it to an incoming list. Good. Understood. I'm guessing that the whole Haskell type declaration idea is based on currying, and I do understand how the <font face="monospace">(a -> b) </font>part "takes" an incoming list, <font face="monospace">[a]</font> and produces the<font face="monospace"> [b] </font>output. Also, I don't understand a and b very well either. Typically, <font face="monospace">a</font> is just a generic variable, then <font face="monospace">b</font> is another generic variable not necessarily the same as <font face="monospace">a</font>. But how are they being used in this type declaration?</div><div><br></div><div>LB</div></div>

        </blockquote>