Add structured types for parsing and type checking
[minfp.git] / parse.icl
index 00e0c26..b80bebb 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -115,11 +115,10 @@ where
 
        pCons = tuple <$> pId <*> many pType
 
-       pType
-               =   TInt  <$ pTop ? (\t->t=:(TTIdent ['Int']))
-               <|> TBool <$ pTop ? (\t->t=:(TTIdent ['Bool']))
-               <|> TVar  <$> pId
-               <|> pBrack pType
+       pType =   TInt  <$ pTop ? (\t->t=:(TTIdent ['Int']))
+             <|> TBool <$ pTop ? (\t->t=:(TTIdent ['Bool']))
+             <|> TVar  <$> pId
+             <|> pBrack (pChainr ((-->) <$ pToken (TTOp ['->'])) $ pChainl (pure TApp) pType)
 
        pId = (\(TTIdent i)->i) <$> pTop ? (\t->t=:(TTIdent _))
        pOp = (\(TTOp i)->i) <$> pTop ? (\t->t=:(TTOp _))
@@ -149,9 +148,7 @@ where
                        (map fst $ sortBy (on (<) snd) ifxs)
                $   pChainl (pure App)
                $   Lambda <$ pToken (TTOp ['\\']) <*> pId <* pToken (TTOp ['.']) <*> pExpression
-               <|> pBrack (   Tuple <$> pExpression <* pToken (TTOp [',']) <*> pExpression
-                              <|> Var <$> pOp
-                              <|> pExpression)
+               <|> pBrack (Var <$> pOp <|> pExpression)
                <|> Lit o Int <$> pInt
                <|> (\(TTBool i)->Lit (Bool i)) <$> pTop ? (\t->t=:(TTBool _))
                <|> (\x->Var ['_':x]) <$ pToken (TTIdent ['code']) <*> pId