Fix polymorphism since the ADT section of VL1 is gone
This commit is contained in:
parent
d9750e6b34
commit
4f67c48b6f
@ -2,19 +2,4 @@ So when we said that haskell is good for abstraction, what did we actually mean?
|
|||||||
\vspace{\baselineskip}
|
\vspace{\baselineskip}
|
||||||
\\
|
\\
|
||||||
\pause
|
\pause
|
||||||
Even better! Haskell supports polymorphism for both data types and functions.\\
|
Even better! Haskell supports polymorphism for both data types and functions.
|
||||||
Let's start with a polymorphic data type:
|
|
||||||
\begin{haskellcode}
|
|
||||||
data List t = Empty | Cons t (List t)
|
|
||||||
\end{haskellcode}
|
|
||||||
So we just implemented our own singly-linked List. For any type! Let's use it:
|
|
||||||
\pause
|
|
||||||
\begin{haskellcode}
|
|
||||||
intList :: List Int
|
|
||||||
intList = Cons 3 (Cons 5 (Cons 2 Empty))
|
|
||||||
|
|
||||||
charList :: List Char
|
|
||||||
charList = Cons 'x' (Cons 'y' (Cons 'z' Empty))
|
|
||||||
|
|
||||||
-- whatever you can imagine goes here
|
|
||||||
\end{haskellcode}
|
|
@ -1,20 +1,19 @@
|
|||||||
And now we are going to write functions to use it:
|
Let's start with a polymorphic function that you already know:
|
||||||
\begin{haskellcode}
|
|
||||||
isListEmpty :: List t -> Bool
|
|
||||||
isListEmpty Emtpy = True
|
|
||||||
isListEmpty x = False
|
|
||||||
\end{haskellcode}
|
|
||||||
\pause
|
|
||||||
We can even have more generic stuff like:
|
|
||||||
\begin{haskellcode}
|
|
||||||
f :: a -> b
|
|
||||||
\end{haskellcode}
|
|
||||||
Whatever the function does... it has something of one type and returns something of another type (it could be the same type, but doesn't need to). That's all we know.
|
|
||||||
\vspace{\baselineskip}
|
|
||||||
\\
|
|
||||||
\pause
|
|
||||||
Similarly, remember the function \hinline{head} which gives us the first element of a list? The type signature actually looks like this:
|
|
||||||
\begin{haskellcode}
|
\begin{haskellcode}
|
||||||
head :: [a] -> a
|
head :: [a] -> a
|
||||||
\end{haskellcode}
|
\end{haskellcode}
|
||||||
Makes sense?
|
\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 has 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.
|
Loading…
Reference in New Issue
Block a user