Rm obsolete slides
This commit is contained in:
		
							parent
							
								
									5b4be12e0b
								
							
						
					
					
						commit
						d9750e6b34
					
				@ -1,20 +0,0 @@
 | 
			
		||||
Of course we can also define our own data types in haskell. One very common type is the \emph{enumeration}. For example, we could define a data type for the Week:
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
data WeekDay = Monday
 | 
			
		||||
             | Tuesday
 | 
			
		||||
             | Thursday
 | 
			
		||||
             | Wednesday
 | 
			
		||||
             | Friday
 | 
			
		||||
             | Saturday
 | 
			
		||||
             | Sunday
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
This declares the new data type \hinline{WeekDay} with 7 \emph{constructors}. That means \hinline{Monday}, \hinline{Tuesday} etc. are all values of the type \hinline{WeekDay}.
 | 
			
		||||
\pause
 | 
			
		||||
\\
 | 
			
		||||
We could now define a whole week, by creating a list:
 | 
			
		||||
\pause
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
week :: [WeekDay]
 | 
			
		||||
week = [Monday, Tuesday, Thursday, Wednesday
 | 
			
		||||
       , Friday, Saturday, Sunday]
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
@ -1,7 +0,0 @@
 | 
			
		||||
And we can again \emph{pattern match} on our \hinline{WeekDay} type. Let's find out if a given day is a Monday:
 | 
			
		||||
\pause
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
isMonday :: WeekDay -> Bool
 | 
			
		||||
isMonday Monday = True
 | 
			
		||||
isMonday x      = False
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
@ -1,14 +0,0 @@
 | 
			
		||||
But we can do more than enumerations. How about we do some error handling? Let's say we want a function to return an \hinline{Int}, but in case something went horribly wrong, we don't just want to return a 0 or some magic number, but a proper error message. Here we go:
 | 
			
		||||
\pause
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
data MaybeInt = NoError Int
 | 
			
		||||
              | Error String
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
\pause
 | 
			
		||||
So constructors are just \emph{functions}! And they can have arguments, just like functions. Let's check their types:
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
> :t NoError
 | 
			
		||||
NoError :: Int -> MaybeInt
 | 
			
		||||
> :t Error
 | 
			
		||||
Error :: String -> MaybeInt
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
@ -1,15 +0,0 @@
 | 
			
		||||
And now we can do sanity checks:
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
calcSomething :: Int -> MaybeInt
 | 
			
		||||
calcSomething x
 | 
			
		||||
  | x < 100   = NoError (x * 5)
 | 
			
		||||
  | otherwise = Error "Int out of range!"
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
\pause
 | 
			
		||||
And pattern match on it as well:
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
addIntToList :: MaybeInt -> [Int]
 | 
			
		||||
addIntToList (NoError x) = [x]
 | 
			
		||||
addIntToList (Error str) = []
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
So if we got an error, we just return an empty list, otherwise we return a list with the \hinline{Int} as its only element.
 | 
			
		||||
@ -1,23 +0,0 @@
 | 
			
		||||
Let's define something more complex. How about a tree?
 | 
			
		||||
\pause
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
data Tree = Leaf Char
 | 
			
		||||
          | Node Tree Int Tree
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
Uh... that looks mean. Let's examine this.\\
 | 
			
		||||
\pause
 | 
			
		||||
We have:
 | 
			
		||||
\begin{itemizep}
 | 
			
		||||
\item defined a data type \hinline{Tree}
 | 
			
		||||
\item a constructor \hinline{Leaf} of type \hinline{Tree} with one arguments of type \hinline{Char}
 | 
			
		||||
\item a constructor \hinline{Node} of type \hinline{Tree} with 3 arguments
 | 
			
		||||
\begin{itemizep}
 | 
			
		||||
\item \hinline{Tree}
 | 
			
		||||
\item \hinline{Int}
 | 
			
		||||
\item \hinline{Tree}
 | 
			
		||||
\end{itemizep}
 | 
			
		||||
\end{itemizep}
 | 
			
		||||
\slidep
 | 
			
		||||
That means: a \hinline{Tree} can either be a \hinline{Leaf} or an internal \hinline{Node} with two sub-trees. If we want to create a \hinline{Leaf}, we have to pass the constructor a \hinline{Char}. If we want to create a \hinline{Node}, we have to pass 3 arguments, in order: another \hinline{Tree}, an \hinline{Int} and yet another \hinline{Tree}.\\
 | 
			
		||||
So we can save information in the leafs (\hinline{Char}) and in the internal nodes (\hinline{Int}).\\
 | 
			
		||||
This is just an example. There are endless more ways of trees.
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
Let's build our tree:
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
tree :: Tree
 | 
			
		||||
tree = Node
 | 
			
		||||
       (Leaf 'x')
 | 
			
		||||
       1
 | 
			
		||||
       (Node
 | 
			
		||||
            (Leaf 'y')
 | 
			
		||||
            2
 | 
			
		||||
            (Leaf 'z')
 | 
			
		||||
       )
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
See board...
 | 
			
		||||
@ -1,7 +0,0 @@
 | 
			
		||||
So if we want to generalize it, an algebraic data type has one or more \textbf{constructors}, and each of them can have zero or more arguments. E.g.:
 | 
			
		||||
\begin{haskellcode}
 | 
			
		||||
data AlgDataType = Constr1 Type11 Type12
 | 
			
		||||
                 | Constr2 Type21
 | 
			
		||||
                 | Constr3 Type31 Type32 Type33
 | 
			
		||||
                 | Constr4
 | 
			
		||||
\end{haskellcode}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user