X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=deliverables%2Fp2%2Fp2.tex;h=09d75d28cf2981765ce4e1b330924faca0d3c02e;hb=097f4bec1e2f95e2926530fdd1dbee177a9caebc;hp=0399d8d51fde04146bc252dd7464d802bfc3e08c;hpb=99821671e939170b1a450940a5d34066122f45a5;p=cc1516.git diff --git a/deliverables/p2/p2.tex b/deliverables/p2/p2.tex index 0399d8d..09d75d2 100644 --- a/deliverables/p2/p2.tex +++ b/deliverables/p2/p2.tex @@ -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?