idris-0.10.3: test/meta002/DataDef.idr
module DataDef
foo : Elab ()
foo = do declareDatatype $ Declare `{{DataDef.N}} [MkFunArg `{{n}} `(Nat) Explicit NotErased] `(Type)
defineDatatype $ DefineDatatype `{{DataDef.N}} [
Constructor `{{MkN}} [MkFunArg `{{x}} `(Nat) Implicit NotErased] (RApp (Var `{{DataDef.N}}) (Var `{{x}})),
Constructor `{{MkN'}} [MkFunArg `{{x}} `(Nat) Explicit NotErased] (RApp (Var `{{DataDef.N}}) (RApp (Var `{S}) (Var `{{x}})))
]
%runElab foo
one : N 1
one = MkN
two : N 2
two = MkN' 1
-- mutual
-- data U : Type where
-- Base : U
-- Pi : (code : U) -> (el code -> U) -> U
-- el : U -> Type
-- el Base = Bool
-- el (Pi code body) = (x : el code) -> el (body x)
mkU : Elab ()
mkU = do let U = `{{DataDef.U}}
let el = `{{DataDef.el}}
declareDatatype $ Declare U [] `(Type)
declareType $ Declare el [MkFunArg `{{code}} (Var U) Explicit NotErased] `(Type)
defineDatatype $ DefineDatatype U [
Constructor `{{Base}} [] (Var U),
Constructor `{{Pi}}
[MkFunArg `{{code}} (Var U) Explicit NotErased,
MkFunArg `{{body}} `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U)) Explicit NotErased]
(Var U)
]
defineFunction $ DefineFun el [
MkFunClause (RBind `{{code}} (PVar (Var U))
(RBind `{{body}} (PVar `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U)))
(RApp (Var el)
(RApp (RApp (Var `{{DataDef.Pi}})
(Var `{{code}}))
(Var `{{body}})))))
(RBind `{{code}} (PVar (Var U))
(RBind `{{body}} (PVar `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U)))
(RBind `{{x}} (Pi (RApp (Var el) (Var `{{code}})) `(Type))
(RApp (Var el) (RApp (Var `{{body}}) (Var `{{x}})))))),
MkFunClause (RApp (Var el) (Var `{{DataDef.Base}})) `(Bool)
]
%runElab mkU
tt : el Base
tt = True
fun : el (Pi Base (\x => if x then Base else Pi Base (const Base)))
fun = \x => (case x of
False => \y => False
True => False)
nope : Elab ()
nope = defineDatatype $ DefineDatatype `{Either} [
Constructor `{{Middle}} [ MkFunArg `{{x}} `(Type) Implicit NotErased
, MkFunArg `{{y}} `(Type) Implicit NotErased
] `(Either ~(Var `{{x}}) ~(Var `{{y}}))
]
%runElab nope