Let's start with a polymorphic function that you already know:
\begin{haskellcode}
head :: [a] -> a
\end{haskellcode}
\pause
So \hinline{head} takes a list of any type and returns an element which must have the \emph{exact same} type of that list.
\vspace{\baselineskip}
\\
\pause
We can also have:
\begin{haskellcode}
f :: a -> b
\end{haskellcode}
\pause
So, whatever the function does... it gets something of one type and returns something of another type. \hinline{b} \emph{could} be the same type as \hinline{a} here, but it doesn't need to! That's all we know about this function.
\vspace{\baselineskip}
\\
\pause
You don't have to use \hinline{a} or \hinline{b} here. These letters are just commonly used for generic types.