@@ -679,9 +679,13 @@ deriving instance NFData Raw
679-- the types of bindings (and their values, if any); the attached identifiers are part
679-- the types of bindings (and their values, if any); the attached identifiers are part
680-- of the 'Bind' constructor for the 'TT' type.
680-- of the 'Bind' constructor for the 'TT' type.
681data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}}
681data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}}
682+ | Pi { binderImpl :: Bool,
682− | Pi { binderTy :: !b,
683+ binderTy :: !b,
683 binderKind :: !b }
684 binderKind :: !b }
684− {-^ A binding that occurs in a function type expression, e.g. @(x:Int) -> ...@ -}
685+ {-^ A binding that occurs in a function type expression, e.g. @(x:Int) -> ...@
686+ The 'binderImpl' flag says whether it was a scoped implicit
687+ (i.e. forall bound) in the high level Idris, but otherwise
688+ has no relevance in TT. -}
685 | Let { binderTy :: !b,
689 | Let { binderTy :: !b,
686 binderVal :: b {-^ value for bound variable-}}
690 binderVal :: b {-^ value for bound variable-}}
687 -- ^ A binding that occurs in a @let@ expression
691 -- ^ A binding that occurs in a @let@ expression
@@ -703,7 +707,7 @@ deriving instance NFData Binder
704instance Sized a => Sized (Binder a) where
708instance Sized a => Sized (Binder a) where
705 size (Lam ty) = 1 + size ty
709 size (Lam ty) = 1 + size ty
706− size (Pi ty _) = 1 + size ty
710+ size (Pi _ ty _) = 1 + size ty
707 size (Let ty val) = 1 + size ty + size val
711 size (Let ty val) = 1 + size ty + size val
708 size (NLet ty val) = 1 + size ty + size val
712 size (NLet ty val) = 1 + size ty + size val
709 size (Hole ty) = 1 + size ty
713 size (Hole ty) = 1 + size ty
@@ -717,7 +721,7 @@ fmapMB f (Let t v) = liftM2 Let (f t) (f v)
717fmapMB f (NLet t v) = liftM2 NLet (f t) (f v)
721fmapMB f (NLet t v) = liftM2 NLet (f t) (f v)
718fmapMB f (Guess t v) = liftM2 Guess (f t) (f v)
722fmapMB f (Guess t v) = liftM2 Guess (f t) (f v)
719fmapMB f (Lam t) = liftM Lam (f t)
723fmapMB f (Lam t) = liftM Lam (f t)
720−fmapMB f (Pi t k) = liftM2 Pi (f t) (f k)
724+fmapMB f (Pi i t k) = liftM2 (Pi i) (f t) (f k)
721fmapMB f (Hole t) = liftM Hole (f t)
725fmapMB f (Hole t) = liftM Hole (f t)
722fmapMB f (GHole i t) = liftM (GHole i) (f t)
726fmapMB f (GHole i t) = liftM (GHole i) (f t)
723fmapMB f (PVar t) = liftM PVar (f t)
727fmapMB f (PVar t) = liftM PVar (f t)
@@ -884,7 +888,7 @@ isInjective (P (DCon _ _ _) _ _) = True
884isInjective (P (TCon _ _) _ _) = True
888isInjective (P (TCon _ _) _ _) = True
885isInjective (Constant _) = True
889isInjective (Constant _) = True
886isInjective (TType x) = True
890isInjective (TType x) = True
887−isInjective (Bind _ (Pi _ _) sc) = True
891+isInjective (Bind _ (Pi _ _ _) sc) = True
888isInjective (App f a) = isInjective f
892isInjective (App f a) = isInjective f
889isInjective _ = False
893isInjective _ = False
@@ -1099,7 +1103,7 @@ freeNames t = nub $ freeNames' t
1100-- | Return the arity of a (normalised) type
1104-- | Return the arity of a (normalised) type
1101arity :: TT n -> Int
1105arity :: TT n -> Int
1102−arity (Bind n (Pi t _) sc) = 1 + arity sc
1106+arity (Bind n (Pi _ t _) sc) = 1 + arity sc
1103arity _ = 0
1107arity _ = 0
1105-- | Deconstruct an application; returns the function and a list of arguments
1109-- | Deconstruct an application; returns the function and a list of arguments
@@ -1159,13 +1163,13 @@ bindTyArgs b xs = bindAll (map (\ (n, ty) -> (n, b ty)) xs)
1159getArgTys :: TT n -> [(n, TT n)]
1163getArgTys :: TT n -> [(n, TT n)]
1160getArgTys (Bind n (PVar _) sc) = getArgTys sc
1164getArgTys (Bind n (PVar _) sc) = getArgTys sc
1161getArgTys (Bind n (PVTy _) sc) = getArgTys sc
1165getArgTys (Bind n (PVTy _) sc) = getArgTys sc
1162−getArgTys (Bind n (Pi t _) sc) = (n, t) : getArgTys sc
1166+getArgTys (Bind n (Pi _ t _) sc) = (n, t) : getArgTys sc
1163getArgTys _ = []
1167getArgTys _ = []
1165getRetTy :: TT n -> TT n
1169getRetTy :: TT n -> TT n
1166getRetTy (Bind n (PVar _) sc) = getRetTy sc
1170getRetTy (Bind n (PVar _) sc) = getRetTy sc
1167getRetTy (Bind n (PVTy _) sc) = getRetTy sc
1171getRetTy (Bind n (PVTy _) sc) = getRetTy sc
1168−getRetTy (Bind n (Pi _ _) sc) = getRetTy sc
1172+getRetTy (Bind n (Pi _ _ _) sc) = getRetTy sc
1169getRetTy sc = sc
1173getRetTy sc = sc
1171uniqueNameFrom :: [Name] -> [Name] -> Name
1175uniqueNameFrom :: [Name] -> [Name] -> Name
@@ -1281,7 +1285,7 @@ prettyEnv env t = prettyEnv' env t False
1282 lbracket <+> text (show i) <+> rbracket
1286 lbracket <+> text (show i) <+> rbracket
1283 | otherwise = text "unbound" <+> text (show i) <+> text "!"
1287 | otherwise = text "unbound" <+> text (show i) <+> text "!"
1284− prettySe p env (Bind n b@(Pi t _) sc) debug
1288+ prettySe p env (Bind n b@(Pi _ t _) sc) debug
1285 | noOccurrence n sc && not debug =
1289 | noOccurrence n sc && not debug =
1286 bracket p 2 $ prettySb env n b debug <> prettySe 10 ((n, b):env) sc debug
1290 bracket p 2 $ prettySb env n b debug <> prettySe 10 ((n, b):env) sc debug
1287 prettySe p env (Bind n b sc) debug =
1291 prettySe p env (Bind n b sc) debug =
@@ -1297,7 +1301,7 @@ prettyEnv env t = prettyEnv' env t False
1297 -- Render a `Binder` and its name
1301 -- Render a `Binder` and its name
1298 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
1302 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
1299 prettySb env n (Hole t) = prettyB env "?defer" "." n t
1303 prettySb env n (Hole t) = prettyB env "?defer" "." n t
1300− prettySb env n (Pi t _) = prettyB env "(" ") ->" n t
1304+ prettySb env n (Pi _ t _) = prettyB env "(" ") ->" n t
1301 prettySb env n (PVar t) = prettyB env "pat" "." n t
1305 prettySb env n (PVar t) = prettyB env "pat" "." n t
1302 prettySb env n (PVTy t) = prettyB env "pty" "." n t
1306 prettySb env n (PVTy t) = prettyB env "pty" "." n t
1303 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
1307 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
@@ -1323,7 +1327,7 @@ showEnv' env t dbg = se 10 env t where
1323 = (show $ fst $ env!!i) ++
1327 = (show $ fst $ env!!i) ++
1324 if dbg then "{" ++ show i ++ "}" else ""
1328 if dbg then "{" ++ show i ++ "}" else ""
1325 | otherwise = "!!V " ++ show i ++ "!!"
1329 | otherwise = "!!V " ++ show i ++ "!!"
1326− se p env (Bind n b@(Pi t k) sc)
1330+ se p env (Bind n b@(Pi _ t k) sc)
1327 | noOccurrence n sc && not dbg = bracket p 2 $ se 1 env t ++ arrow k ++ se 10 ((n,b):env) sc
1331 | noOccurrence n sc && not dbg = bracket p 2 $ se 1 env t ++ arrow k ++ se 10 ((n,b):env) sc
1328 where arrow (TType _) = " -> "
1332 where arrow (TType _) = " -> "
1329 arrow u = " [" ++ show u ++ "] -> "
1333 arrow u = " [" ++ show u ++ "] -> "
@@ -1339,7 +1343,7 @@ showEnv' env t dbg = se 10 env t where
1339 sb env n (Lam t) = showb env "\\ " " => " n t
1343 sb env n (Lam t) = showb env "\\ " " => " n t
1340 sb env n (Hole t) = showb env "? " ". " n t
1344 sb env n (Hole t) = showb env "? " ". " n t
1341 sb env n (GHole i t) = showb env "?defer " ". " n t
1345 sb env n (GHole i t) = showb env "?defer " ". " n t
1342− sb env n (Pi t _) = showb env "(" ") -> " n t
1346+ sb env n (Pi _ t _) = showb env "(" ") -> " n t
1343 sb env n (PVar t) = showb env "pat " ". " n t
1347 sb env n (PVar t) = showb env "pat " ". " n t
1344 sb env n (PVTy t) = showb env "pty " ". " n t
1348 sb env n (PVTy t) = showb env "pty " ". " n t
1345 sb env n (Let t v) = showbv env "let " " in " n t v
1349 sb env n (Let t v) = showbv env "let " " in " n t v
@@ -1399,7 +1403,7 @@ orderPats tm = op [] tm
1400 op ps (Bind n (PVar t) sc) = op ((n, PVar t) : ps) sc
1404 op ps (Bind n (PVar t) sc) = op ((n, PVar t) : ps) sc
1401 op ps (Bind n (Hole t) sc) = op ((n, Hole t) : ps) sc
1405 op ps (Bind n (Hole t) sc) = op ((n, Hole t) : ps) sc
1402− op ps (Bind n (Pi t k) sc) = op ((n, Pi t k) : ps) sc
1406+ op ps (Bind n (Pi i t k) sc) = op ((n, Pi i t k) : ps) sc
1403 op ps sc = bindAll (sortP ps) sc
1407 op ps sc = bindAll (sortP ps) sc
1405 sortP ps = pick [] (reverse ps)
1409 sortP ps = pick [] (reverse ps)
@@ -1445,10 +1449,10 @@ liftPats tm = let (tm', ps) = runState (getPats tm) [] in
1445 v' <- getPats v
1449 v' <- getPats v
1446 sc' <- getPats sc
1450 sc' <- getPats sc
1447 return (Bind n (Let t' v') sc')
1451 return (Bind n (Let t' v') sc')
1448− getPats (Bind n (Pi t k) sc) = do t' <- getPats t
1452+ getPats (Bind n (Pi i t k) sc) = do t' <- getPats t
1449− k' <- getPats k
1453+ k' <- getPats k
1450− sc' <- getPats sc
1454+ sc' <- getPats sc
1451− return (Bind n (Pi t' k') sc')
1455+ return (Bind n (Pi i t' k') sc')
1452 getPats (Bind n (Lam t) sc) = do t' <- getPats t
1456 getPats (Bind n (Lam t) sc) = do t' <- getPats t
1453 sc' <- getPats sc
1457 sc' <- getPats sc
1454 return (Bind n (Lam t') sc')
1458 return (Bind n (Lam t') sc')