on master help sign in
Make FunDefn and FunClause polymorphic over TT and Raw
commitcdc7238b9fcdf9fbe3e2677d333df46ac5a49b5b authorShea Levy <shea@shealevy.com> dateSat 28 Nov 2015, 12:15 (11 years ago) parentc1fabb1
8 files changed+60−76
libs/prelude/Language/Reflection/Elab.idr+10−10 libs/pruviloj/Pruviloj/Derive/DecEq.idr+1−1 libs/pruviloj/Pruviloj/Derive/Eliminators.idr+3−3 libs/pruviloj/Pruviloj/Internals.idr+1−1 src/Idris/Core/TT.hs−1 src/Idris/Elab/Term.hs+2−2 src/Idris/Reflection.hs+30−45 test/meta001/Finite.idr+13−13
libs/prelude/Language/Reflection/Elab.idr+10−10
@@ -70,15 +70,15 @@ record TyDecl where
7070
7171
7272||| A single pattern-matching clause
73−data FunClause : Type where
74− MkFunClause : (lhs, rhs : Raw) -> FunClause
75− MkImpossibleClause : (lhs : Raw) -> FunClause
73+data FunClause : Type -> Type where
74+ MkFunClause : (lhs, rhs : a) -> FunClause a
75+ MkImpossibleClause : (lhs : a) -> FunClause a
7676
7777||| A reflected function definition.
78−record FunDefn where
78+record FunDefn a where
7979 constructor DefineFun
8080 name : TTName
81− clauses : List FunClause
81+ clauses : List (FunClause a)
8282
8383
8484data CtorArg = CtorParameter FunArg | CtorField FunArg
@@ -115,7 +115,7 @@ data Elab : Type -> Type where
115115 Prim__Guess : Elab TT
116116 Prim__LookupTy : TTName -> Elab (List (TTName, NameType, TT))
117117 Prim__LookupDatatype : TTName -> Elab (List Datatype)
118− Prim__LookupFunDefn : TTName -> Elab (List FunDefn)
118+ Prim__LookupFunDefn : TTName -> Elab (List (FunDefn TT))
119119 Prim__LookupArgs : TTName -> Elab (List (TTName, List FunArg, Raw))
120120
121121 Prim__Check : List (TTName, Binder TT) -> Raw -> Elab (TT, TT)
@@ -148,7 +148,7 @@ data Elab : Type -> Type where
148148 Prim__Converts : (List (TTName, Binder TT)) -> TT -> TT -> Elab ()
149149
150150 Prim__DeclareType : TyDecl -> Elab ()
151− Prim__DefineFunction : FunDefn -> Elab ()
151+ Prim__DefineFunction : FunDefn Raw -> Elab ()
152152 Prim__AddInstance : TTName -> TTName -> Elab ()
153153 Prim__IsTCName : TTName -> Elab Bool
154154
@@ -233,13 +233,13 @@ namespace Tactics
233233
234234 ||| Find the reflected function definition of all functions whose names
235235 ||| are overloadings of some name.
236− lookupFunDefn : TTName -> Elab (List FunDefn)
236+ lookupFunDefn : TTName -> Elab (List (FunDefn TT))
237237 lookupFunDefn n = Prim__LookupFunDefn n
238238
239239 ||| Find the reflected function definition of a function, given its
240240 ||| fully-qualified name. Fail if the name does not uniquely resolve
241241 ||| to a function.
242− lookupFunDefnExact : TTName -> Elab FunDefn
242+ lookupFunDefnExact : TTName -> Elab (FunDefn TT)
243243 lookupFunDefnExact n = case !(lookupFunDefn n) of
244244 [res] => return res
245245 [] => fail [TextPart "No function named", NamePart n]
@@ -465,7 +465,7 @@ namespace Tactics
465465 ||| Define a function in the global context. The function must have
466466 ||| already been declared, either in ordinary Idris code or using
467467 ||| `declareType`.
468− defineFunction : FunDefn -> Elab ()
468+ defineFunction : FunDefn Raw -> Elab ()
469469 defineFunction defun = Prim__DefineFunction defun
470470
471471 ||| Register a new instance for type class resolution.
libs/pruviloj/Pruviloj/Derive/DecEq.idr+1−1
@@ -183,7 +183,7 @@ deriveDecEq fn =
183183 Nothing => return False
184184
185185 partial -- mkRhs
186− mkCase : Nat -> TTName -> (x, y : (TTName, List CtorArg, Raw)) -> Elab (Maybe FunClause)
186+ mkCase : Nat -> TTName -> (x, y : (TTName, List CtorArg, Raw)) -> Elab (Maybe (FunClause Raw))
187187 mkCase k fam (cn1, args1, _) (cn2, args2, _) =
188188 perhaps $ elabPatternClause
189189 (do (h2 :: h1 :: _) <- reverse <$>
libs/pruviloj/Pruviloj/Derive/Eliminators.idr+3−3
@@ -134,7 +134,7 @@ instance Show ElimArg where
134134 show (NormalArgument x) = "NormalArgument " ++ show x
135135
136136getElimClause : TyConInfo -> (elimn : TTName) -> (methCount : Nat) ->
137− (TTName, List CtorArg, Raw) -> Nat -> Elab FunClause
137+ (TTName, List CtorArg, Raw) -> Nat -> Elab (FunClause Raw)
138138getElimClause info elimn methCount (cn, args, resTy) whichCon =
139139 elabPatternClause
140140 (do -- Establish a hole for each parameter
@@ -242,13 +242,13 @@ getElimClause info elimn methCount (cn, args, resTy) whichCon =
242242 bindLam ((n, b)::rest) x = RBind n (Lam (getBinderTy b)) $ bindLam rest x
243243
244244getElimClauses : TyConInfo -> (elimn : TTName) ->
245− List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
245+ List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
246246getElimClauses info elimn ctors =
247247 let methodCount = length ctors
248248 in traverse (\(i, con) => getElimClause info elimn methodCount con i)
249249 (enumerate ctors)
250250
251−instance Show FunClause where
251+instance (Show a) => Show (FunClause a) where
252252 show (MkFunClause x y) = "(MkFunClause " ++ show x ++ " " ++ show y ++ ")"
253253
254254abstract
libs/pruviloj/Pruviloj/Internals.idr+1−1
@@ -101,7 +101,7 @@ bindPatTys ((n, b)::bs) res = RBind n (PVTy (getBinderTy b)) $ bindPatTys bs res
101101||| It will be run in a context where the pattern variables are
102102||| already bound, and should leave behind no holes.
103103partial
104−elabPatternClause : (lhs, rhs : Elab ()) -> Elab FunClause
104+elabPatternClause : (lhs, rhs : Elab ()) -> Elab (FunClause Raw)
105105elabPatternClause lhs rhs =
106106 do -- Elaborate the LHS in a context where its type will be solved via unification
107107 (pat, _) <- runElab `(Infer) $
src/Idris/Core/TT.hs−1
@@ -1107,7 +1107,6 @@ instantiate e = subst 0 where
11071107 subst i (Bind x b sc) = Bind x (fmap (subst i) b) (subst (i+1) sc)
11081108 subst i (App s f a) = App s (subst i f) (subst i a)
11091109 subst i (Proj x idx) = Proj (subst i x) idx
1110− -- If ever adding a clause here, please update mkFunClause in Idris/Reflection.hs
11111110 subst i t = t
11121111
11131112-- | As 'instantiate', but also decrement the indices of all de Bruijn variables
src/Idris/Elab/Term.hs+2−2
@@ -1770,7 +1770,7 @@ runElabAction ist fc env tm ns = do tm' <- eval tm
17701770 pullVars :: (Term, Term) -> ([Name], Term, Term)
17711771 pullVars (lhs, rhs) = (fst (patvars [] lhs), snd (patvars [] lhs), snd (patvars [] rhs)) -- TODO alpha-convert rhs
17721772
1773− defineFunction :: RFunDefn -> ElabD ()
1773+ defineFunction :: RFunDefn Raw -> ElabD ()
17741774 defineFunction (RDefineFun n clauses) =
17751775 do ctxt <- get_context
17761776 ty <- maybe (fail "no type decl") return $ lookupTyExact n ctxt
@@ -1865,7 +1865,7 @@ runElabAction ist fc env tm ns = do tm' <- eval tm
18651865 | n == tacN "Prim__LookupFunDefn", [name] <- args
18661866 = do n' <- reifyTTName name
18671867 fmap fst . checkClosed $
1868− rawList (Var (tacN "FunDefn"))
1868+ rawList (RApp (Var $ tacN "FunDefn") (Var $ reflm "TT"))
18691869 (map reflectFunDefn (buildFunDefns ist n'))
18701870 | n == tacN "Prim__LookupArgs", [name] <- args
18711871 = do n' <- reifyTTName name
src/Idris/Reflection.hs+30−45
@@ -11,7 +11,7 @@ import Prelude hiding (mapM)
1111import Data.Traversable (mapM)
1212#endif
1313import Control.Monad (liftM, liftM2, liftM4)
14−import Control.Monad.State.Strict (lift, State, runState, put)
14+import Control.Monad.State.Strict (lift)
1515import Data.Maybe (catMaybes)
1616import Data.List ((\\), findIndex)
1717import qualified Data.Text as T
@@ -57,11 +57,11 @@ rFunArgToPArg (RFunArg n _ RExplicit e) = PExp 0 (rArgOpts e) n Placeholder
5757rFunArgToPArg (RFunArg n _ RImplicit e) = PImp 0 False (rArgOpts e) n Placeholder
5858rFunArgToPArg (RFunArg n _ RConstraint e) = PConstraint 0 (rArgOpts e) n Placeholder
5959
60−data RFunClause = RMkFunClause Raw Raw
61− | RMkImpossibleClause Raw
62− deriving Show
60+data RFunClause a = RMkFunClause a a
61+ | RMkImpossibleClause a
62+ deriving Show
6363
64−data RFunDefn = RDefineFun Name [RFunClause] deriving Show
64+data RFunDefn a = RDefineFun Name [RFunClause a] deriving Show
6565
6666-- | Prefix a name with the "Language.Reflection" namespace
6767reflm :: String -> Name
@@ -1025,21 +1025,21 @@ reifyTyDecl (App _ (App _ (App _ (P (DCon _ _ _) n _) tyN) args) ret)
10251025 return $ RDeclare tyN' args' ret'
10261026reifyTyDecl tm = fail $ "Couldn't reify " ++ show tm ++ " as a type declaration."
10271027
1028−reifyFunDefn :: Term -> ElabD RFunDefn
1029−reifyFunDefn (App _ (App _ (P _ n _) fnN) clauses)
1030− | n == tacN "DefineFun" =
1028+reifyFunDefn :: Term -> ElabD (RFunDefn Raw)
1029+reifyFunDefn (App _ (App _ (App _ (P _ n _) (P _ t _)) fnN) clauses)
1030+ | n == tacN "DefineFun" && t == reflm "Raw" =
10311031 do fnN' <- reifyTTName fnN
10321032 clauses' <- case unList clauses of
10331033 Nothing -> fail $ "Couldn't reify " ++ show clauses ++ " as a clause list"
10341034 Just cs -> mapM reifyC cs
10351035 return $ RDefineFun fnN' clauses'
1036− where reifyC :: Term -> ElabD RFunClause
1037− reifyC (App _ (App _ (P (DCon _ _ _) n _) lhs) rhs)
1038− | n == tacN "MkFunClause" = liftM2 RMkFunClause
1036+ where reifyC :: Term -> ElabD (RFunClause Raw)
1037+ reifyC (App _ (App _ (App _ (P (DCon _ _ _) n _) (P _ t _)) lhs) rhs)
1038+ | n == tacN "MkFunClause" && t == reflm "Raw" = liftM2 RMkFunClause
10391039 (reifyRaw lhs)
10401040 (reifyRaw rhs)
1041− reifyC (App _ (P (DCon _ _ _) n _) lhs)
1042− | n == tacN "MkImpossibleClause" = fmap RMkImpossibleClause $ reifyRaw lhs
1041+ reifyC (App _ (App _ (P (DCon _ _ _) n _) (P _ t _)) lhs)
1042+ | n == tacN "MkImpossibleClause" && t == reflm "Raw" = fmap RMkImpossibleClause $ reifyRaw lhs
10431043 reifyC tm = fail $ "Couldn't reify " ++ show tm ++ " as a clause."
10441044reifyFunDefn tm = fail $ "Couldn't reify " ++ show tm ++ " as a function declaration."
10451045
@@ -1078,37 +1078,19 @@ unApplyRaw tm = ua [] tm
10781078
10791079-- | Build the reflected function definition(s) that correspond(s) to
10801080-- a provided unqualifed name
1081−buildFunDefns :: IState -> Name -> [RFunDefn]
1081+buildFunDefns :: IState -> Name -> [RFunDefn Term]
10821082buildFunDefns ist n =
10831083 [ mkFunDefn name clauses
10841084 | (name, (clauses, _)) <- lookupCtxtName n $ idris_patdefs ist
10851085 ]
1086− where mkFunDefn name clauses = RDefineFun name (map (mkFunClause name) clauses)
1087−
1088− mkFunClause :: Name -> ([Name], Term, Term) -> RFunClause
1089− mkFunClause _ ([], lhs, Impossible) = RMkImpossibleClause (forget lhs)
1090− mkFunClause _ ([], lhs, rhs) = RMkFunClause (forget lhs) (forget rhs)
1091− mkFunClause name ((n : ns), lhs, rhs) = mkFunClause name (ns, lhs', rhs') where
1092− (lhs', ty) = case (runState (subst 0 lhs) Nothing) of
1093− (_, Nothing) -> error $ "Patvar " ++ show n ++ " not bound on the LHS of " ++ show name
1094− (tm', Just ty) -> (Bind n (PVar ty) tm', ty)
1095−
1096− rhs' = case (runState (subst 0 rhs) (Just ty)) of
1097− (tm', _) -> Bind n (PVar ty) tm'
1098−
1099− subst :: Int -> Term -> State (Maybe Term) Term
1100− subst i (P nt n' ty) | n' == n && nt == Bound = put (Just ty) >> return (V i)
1101− | otherwise = subst i ty >>= return . P nt n'
1102− subst i t@(Bind n' b sc) | n == n = return t -- The name is shadowed, so we won't find it here
1103− | otherwise = do b' <- mapM (subst i) b
1104− sc' <- subst (i + 1) sc
1105− return $ Bind n' b' sc'
1106− subst i (App s f a) = do f' <- subst i f
1107− a' <- subst i a
1108− return $ App s f' a'
1109− subst i (Proj x idx) = do x' <- subst i x
1110− return $ Proj x' idx
1111− subst i t = return t
1086+
1087+ where mkFunDefn name clauses = RDefineFun name (map mkFunClause clauses)
1088+
1089+ mkFunClause ([], lhs, Impossible) = RMkImpossibleClause lhs
1090+ mkFunClause ([], lhs, rhs) = RMkFunClause lhs rhs
1091+ mkFunClause ((n : ns), lhs, rhs) = mkFunClause (ns, bind lhs, bind rhs) where
1092+ bind Impossible = Impossible
1093+ bind tm = Bind n (PVar Erased) tm
11121094
11131095-- | Build the reflected datatype definition(s) that correspond(s) to
11141096-- a provided unqualified name
@@ -1200,9 +1182,12 @@ reflectDatatype (RDatatype tyn tyConArgs tyConRes constrs) =
12001182 reflectConArg (RIndex a) =
12011183 RApp (Var $ tacN "TyConIndex") (reflectArg a)
12021184
1203−reflectFunClause :: RFunClause -> Raw
1204−reflectFunClause (RMkFunClause lhs rhs) = raw_apply (Var $ tacN "MkFunClause") [ lhs, rhs ]
1205−reflectFunClause (RMkImpossibleClause lhs) = RApp (Var $ tacN "MkImpossibleClause") lhs
1185+reflectFunClause :: RFunClause Term -> Raw
1186+reflectFunClause (RMkFunClause lhs rhs) = raw_apply (Var $ tacN "MkFunClause") $ (Var $ reflm "TT") : map reflect [ lhs, rhs ]
1187+reflectFunClause (RMkImpossibleClause lhs) = raw_apply (Var $ tacN "MkImpossibleClause") $ [ Var $ reflm "TT", reflect lhs ]
12061188
1207−reflectFunDefn :: RFunDefn -> Raw
1208−reflectFunDefn (RDefineFun name clauses) = raw_apply (Var $ tacN "DefineFun") [reflectName name, rawList (Var $ tacN "FunClause") (map reflectFunClause clauses)]
1189+reflectFunDefn :: RFunDefn Term -> Raw
1190+reflectFunDefn (RDefineFun name clauses) = raw_apply (Var $ tacN "DefineFun") [ Var $ reflm "TT"
1191+ , reflectName name
1192+ , rawList (RApp (Var $ tacN "FunClause") (Var $ reflm "TT")) (map reflectFunClause clauses)
1193+ ]
test/meta001/Finite.idr+13−13
@@ -29,7 +29,7 @@ mkFin (S k) (S j) = do i <- mkFin k j
2929
3030mkToClause : TTName -> (size, i : Nat) ->
3131 (constr : (TTName, List CtorArg, Raw)) ->
32− Elab FunClause
32+ Elab (FunClause Raw)
3333mkToClause fn size i (n, [], Var ty) =
3434 MkFunClause (RApp (Var fn) (Var n)) <$> mkFin size i
3535mkToClause fn size i (n, _, ty) =
@@ -38,14 +38,14 @@ mkToClause fn size i (n, _, ty) =
3838
3939mkFromClause : TTName -> (size, i : Nat) ->
4040 (constr : (TTName, List CtorArg, Raw)) ->
41− Elab FunClause
41+ Elab (FunClause Raw)
4242mkFromClause fn size i (n, [], Var ty) =
4343 return $ MkFunClause (RApp (Var fn) !(mkFin size i)) (Var n)
4444mkFromClause fn size i (n, _, ty) =
4545 fail [TextPart "unsupported constructor", NamePart n]
4646
4747
48−mkOk1Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause
48+mkOk1Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab (FunClause Raw)
4949mkOk1Clause fn size i (n, [], Var ty) =
5050 return $ MkFunClause (RApp (Var fn) (Var n))
5151 [| (Var (UN "Refl")) (Var ty) (Var n) |]
@@ -53,7 +53,7 @@ mkOk1Clause fn size i (n, _, ty) =
5353 fail [TextPart "unsupported constructor", NamePart n]
5454
5555
56−mkOk2Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause
56+mkOk2Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab (FunClause Raw)
5757mkOk2Clause fn size i (n, [], Var ty) =
5858 return $ MkFunClause (RApp (Var fn) !(mkFin size i))
5959 [| (Var "Refl") `(Fin ~(quote size))
@@ -62,9 +62,9 @@ mkOk2Clause fn size i (n, _, ty) =
6262 fail [TextPart "unsupported constructor", NamePart n]
6363
6464
65−mkToClauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
65+mkToClauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
6666mkToClauses fn size xs = mkToClauses' Z xs
67− where mkToClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
67+ where mkToClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
6868 mkToClauses' k [] = return []
6969 mkToClauses' k (x :: xs) = do rest <- mkToClauses' (S k) xs
7070 clause <- mkToClause fn size k x
@@ -76,7 +76,7 @@ mkToClauses fn size xs = mkToClauses' Z xs
7676||| This is to satisfy the totality checker, because `impossible`
7777||| clauses are still
7878mkAbsurdFinClause : (fn : TTName) -> (goal : Raw -> Raw) -> (size : Nat) ->
79− Elab FunClause
79+ Elab (FunClause Raw)
8080mkAbsurdFinClause fn goal size =
8181 do pv <- gensym "badfin"
8282 lhsArg <- lhsBody pv size
@@ -92,26 +92,26 @@ mkAbsurdFinClause fn goal size =
9292
9393
9494mkFromClauses : TTName -> TTName -> Nat ->
95− List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
95+ List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
9696mkFromClauses fn ty size xs = mkFromClauses' Z xs
97− where mkFromClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
97+ where mkFromClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
9898 mkFromClauses' k [] =
9999 return [!(mkAbsurdFinClause fn (const (Var ty)) size)]
100100 mkFromClauses' k (x :: xs) = do rest <- mkFromClauses' (S k) xs
101101 clause <- mkFromClause fn size k x
102102 return $ clause :: rest
103103
104−mkOk1Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
104+mkOk1Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
105105mkOk1Clauses fn size xs = mkOk1Clauses' Z xs
106− where mkOk1Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
106+ where mkOk1Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
107107 mkOk1Clauses' k [] = return []
108108 mkOk1Clauses' k (x :: xs) = do rest <- mkOk1Clauses' (S k) xs
109109 clause <- mkOk1Clause fn size k x
110110 return $ clause :: rest
111111
112−mkOk2Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> (Raw -> Raw) -> Elab (List FunClause)
112+mkOk2Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> (Raw -> Raw) -> Elab (List (FunClause Raw))
113113mkOk2Clauses fn size xs resTy = mkOk2Clauses' Z xs
114− where mkOk2Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
114+ where mkOk2Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
115115 mkOk2Clauses' k [] = return [!(mkAbsurdFinClause fn resTy size)]
116116 mkOk2Clauses' k (x :: xs) = do rest <- mkOk2Clauses' (S k) xs
117117 clause <- mkOk2Clause fn size k x