@@ -51,18 +51,21 @@ parseProg fname = do file <- lift $ readFile fname
51pFullExpr = do x <- pExpr; eof; return x
51pFullExpr = do x <- pExpr; eof; return x
53pDecl :: IParser PDecl
53pDecl :: IParser PDecl
54−pDecl = do d <- pDecl'; lchar ';'; return d
54+pDecl = do d <- pDecl'; lchar ';';
56+ return (fmap (addImpl i) d)
56--------- Top Level Declarations ---------
58--------- Top Level Declarations ---------
58pDecl' :: IParser PDecl
60pDecl' :: IParser PDecl
59pDecl' = try pFixity
61pDecl' = try pFixity
60 <|> try (do n <- pfName; ty <- pTSig
62 <|> try (do n <- pfName; ty <- pTSig
61− return (PTy n ty))
64+ return (PTy n ty'))
62 <|> try pData
65 <|> try pData
63 <|> try pPattern
66 <|> try pPattern
65−-------- Fixity --------
68+--------- Fixity ---------
67pFixity :: IParser PDecl
70pFixity :: IParser PDecl
68pFixity = do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
71pFixity = do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
@@ -146,15 +149,19 @@ binary name f assoc = Infix (do { reservedOp name; return f }) assoc
146pData :: IParser PDecl
149pData :: IParser PDecl
147pData = try (do reserved "data"; tyn <- pfName; ty <- pTSig
150pData = try (do reserved "data"; tyn <- pfName; ty <- pTSig
148 reserved "where"
151 reserved "where"
152+ ty' <- implicit tyn ty
149 cons <- sepBy1 pConstructor (lchar '|')
153 cons <- sepBy1 pConstructor (lchar '|')
150− return $ PData (PDatadecl tyn ty cons))
154+ return $ PData (PDatadecl tyn ty' cons))
151 <|> do reserved "data"; tyn <- pfName; args <- many iName
155 <|> do reserved "data"; tyn <- pfName; args <- many iName
152 lchar '='
156 lchar '='
153 cons <- sepBy1 pSimpleCon (lchar '|')
157 cons <- sepBy1 pSimpleCon (lchar '|')
154 let conty = mkPApp (PRef tyn) (map PRef args)
158 let conty = mkPApp (PRef tyn) (map PRef args)
155− return $ PData (PDatadecl tyn (bindArgs (map (\a -> PSet) args) PSet)
159+ let ty = bindArgs (map (\a -> PSet) args) PSet
156− (map (\ (x, cargs) ->
160+ ty' <- implicit tyn ty
157− (x, bindArgs cargs conty)) cons))
161+ cons' <- mapM (\ (x, cargs) -> do let cty = bindArgs cargs conty
162+ cty' <- implicit x cty
163+ return (x, cty')) cons
164+ return $ PData (PDatadecl tyn ty' cons')
159mkPApp t [] = t
166mkPApp t [] = t
160mkPApp t xs = PApp t [] xs
167mkPApp t xs = PApp t [] xs
@@ -188,3 +195,17 @@ pPattern = try (do n <- pfName
188 rhs <- pExpr
195 rhs <- pExpr
189 return $ PClause (PApp (PRef (UN [op])) [] [l,r]) rhs
196 return $ PClause (PApp (PRef (UN [op])) [] [l,r]) rhs
198+-- Dealing with implicit arguments
200+implicit :: Name -> PTerm -> IParser PTerm
203+ let (tm', names) = implicitise i ptm
204+ setState (i { idris_implicits = addDef n names (idris_implicits i) })
207+addImplicits :: PTerm -> IParser PTerm
210+ return (addImpl i tm)