But we can do more than enumerations. How about we do some error handling? Let's say we want a function to return an \code{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} \pause 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}