\pause%
\begin{block}{Order?}
Does matter for variables, not for functions.
+ \pause
+ \begin{itemize}
+ \item Note that this means that \texttt{ones=1:ones} is
+ not allowed.
+ \end{itemize}
\end{block}
\pause%
\begin{block}{Mutual recursion?}
\end{block}
\pause%
\begin{block}{Higher order functions?}
- Hopefully in the future
+ Would be an interesting idea for assignment 4
\end{block}
\end{frame}
+\begin{frame}[fragile]
+ \frametitle{Mutual Recursion}
+ \begin{itemize}
+ \item Mutual recursion is allowed and type checked, however inference is
+ not complete.
+ \pause
+ \begin{CleanCode}
+flip(n, l) :: Int -> [Int] -> [Int] {
+ if( n <= 0 ) {return l;}
+ else {return flop(n-1, 0:l);}
+}
+
+flop(n, l) :: Int -> [Int] -> [Int] {
+ return flip(n, 1:l);
+}
+ \end{CleanCode}
+ \pause
+ \item Completely typed specifications are checked correctly.
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Mutual Recursion}
+ \begin{itemize}
+ \item Mutual recursion is allowed and type checked, however inference is
+ not complete.
+ \begin{CleanCode}
+flip(n, l) :: Int -> [Int] -> [Int] {
+ if( n <= 0 ) {return l;}
+ else {return flop(n-1, 0:l);}
+}
+
+flop(n, l) :: Int -> [Int] -> Bool {
+ return flip(n, 1:l);
+}
+ \end{CleanCode}
+ \pause
+ \item It is also correctly determined that \texttt{Bool} and the return
+ type of \texttt{flop(n,l)} don't match.
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Mutual Recursion}
+ \begin{itemize}
+ \item Mutual recursion is allowed and type checked, however inference is
+ not complete.
+ \pause
+ \begin{CleanCode}
+flip(n, l) {
+ if( n <= 0 ) {return l;}
+ else {return flop(n-1, 0:l);}
+}
+
+flop(n, l) {
+ return flip(n, 1:l);
+}
+ \end{CleanCode}
+ \end{itemize}
+\end{frame}
+
+
+\begin{frame}[fragile]
+ \frametitle{Mutual Recursion}
+ \begin{itemize}
+ \item Mutual recursion is allowed and type checked, however inference is
+ not complete.
+ \begin{CleanCode}
+flip(n, l) :: Int -> [Int] -> vTqhp {
+ if( n <= 0 ) {return l;}
+ else {return flop(n-1, 0:l);}
+}
+
+flop(n, l) :: Int -> [Int] -> HSWdn {
+ return flip(n, 1:l);
+}
+ \end{CleanCode}
+ \item However when no type information is given at all our algorithm
+ fails to correctly infer the result type of the two function.
+ \end{itemize}
+\end{frame}
+
% - Can functions that are defined later in a file call earlier defined functions?
% - Can local variables be defined in terms of other local variables?
% - How do you deal with assignments?