Merge branch 'master' of https://github.com/dopefishh/cc1516
[cc1516.git] / deliverables / p2 / p2.tex
index 0399d8d..09d75d2 100644 (file)
@@ -67,6 +67,11 @@ sem :: AST -> SemOutput
        \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?}
@@ -74,10 +79,92 @@ sem :: AST -> SemOutput
        \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?