From: pimjager Date: Thu, 14 Apr 2016 09:21:29 +0000 (+0200) Subject: working on presentation X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=158fb0cf298aaae42c8460f92bb7d797d5def9bd;p=cc1516.git working on presentation --- diff --git a/deliverables/p2/p2.tex b/deliverables/p2/p2.tex index 09d75d2..a3fca20 100644 --- a/deliverables/p2/p2.tex +++ b/deliverables/p2/p2.tex @@ -130,7 +130,6 @@ flop(n, l) :: Int -> [Int] -> Bool { \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;} @@ -165,6 +164,36 @@ flop(n, l) :: Int -> [Int] -> HSWdn { \end{itemize} \end{frame} +\begin{frame}[fragile] + \frametitle{But wait, there is more!} + \framesubtitle{Trouble that is} + \begin{itemize} + \item Polymorphism is not working great either. + \begin{CleanCode} +id(x) :: a -> a { + return x; +} + \end{CleanCode} + \pause + \item Is typed fun, but when we introduce: + \begin{CleanCode} +var x = id(5); +var y = id(True); + \end{CleanCode} + \pause + \begin{CleanCode} +2:12 SemError: Cannot unify types. Expected: Int. Given: Bool + \end{CleanCode} + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{But wait, there is more!} + \framesubtitle{Trouble that is} + + \begin +\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? diff --git a/sem.icl b/sem.icl index 3438810..06200b1 100644 --- a/sem.icl +++ b/sem.icl @@ -59,25 +59,19 @@ semFunDecl fd=:(FunDecl p f args mt vds stmts) = matchFunctions args ft >>= \tres-> mapM semVarDecl vds >>= \newvds-> mapM (checkStmt tres) stmts >>= \newstmts-> - inferReturnType stmts >>= \returntype-> case mt of - Nothing = reconstructType args tres + Nothing = inferReturnType stmts + >>= \returntype->reconstructType args tres >>= \ftype->restoreGamma gamma >>| putIdent f ftype >>| pure ( FunDecl p f args (Just ftype) newvds newstmts) - Just t = restoreGamma gamma >>| updateFunType t returntype - >>= \tt-> pure (FunDecl p f args (Just tt) newvds newstmts) - -updateFunType :: Type Type -> Env Type -updateFunType t1 t2 = unify t1 t2 -updateFunType (t1 ->> t2) t3 = t1 ->> (updateFunType t2 t3) + Just t = restoreGamma gamma + >>| pure (FunDecl p f args mt newvds newstmts) inferReturnType :: [Stmt] -> Env Type inferReturnType [] = pure VoidType -inferReturnType [ReturnStmt (Just t):rest] = typeExpr t - >>= \tx->inferReturnType rest >>= \ty->unify tx ty -inferReturnType [ReturnStmt _:rest] = - inferReturnType rest >>= \tx-> unify VoidType tx +inferReturnType [ReturnStmt (Just t):rest] = typeExpr t +inferReturnType [ReturnStmt _:rest] = pure VoidType inferReturnType [_:rest] = inferReturnType rest reconstructType :: [String] Type -> Env Type @@ -206,8 +200,6 @@ instance unify Type where unify (ListType t1) (ListType t2) = unify t1 t2 >>| (pure $ ListType t1) unify (ta1 ->> ta2) (tb1 ->> tb2) = unify ta1 tb1 >>= \ta-> unify ta2 tb2 >>= \tb-> pure (ta ->> tb) - unify VoidType t = pure t - unify t VoidType = pure t unify VoidType VoidType = pure VoidType unify t1 t2 = liftT $ Left $ UnifyError zero t1 t2