| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Mikan.TypeChecking.Rules.Term
Synopsis
- isType :: Expr -> Sort -> TCM Type
- isType' :: Comparison -> Expr -> Sort -> TCM Type
- isType_ :: Expr -> TCM Type
- checkLevel :: NamedArg Expr -> TCM Level
- isTypeEqualTo :: Expr -> Type -> TCM Type
- leqType_ :: Type -> Type -> TCM ()
- data ModTelOrigin
- checkGeneralizeTelescope :: ModTelOrigin -> Maybe ModuleName -> GeneralizeTelescope -> ([Maybe Name] -> Telescope -> TCM a) -> TCM a
- checkTelescope :: ModTelOrigin -> Telescope -> (Telescope -> TCM a) -> TCM a
- checkPiTelescope :: Telescope -> (Telescope -> TCM a) -> TCM a
- data LamOrPi
- checkTelescope' :: LamOrPi -> Telescope -> (Telescope -> TCM a) -> TCM a
- checkDomain :: LamOrPi -> Maybe Name -> List1 a -> Expr -> TCM Type
- checkPiDomain :: Maybe Name -> List1 a -> Expr -> TCM Type
- checkTypedBindings :: LamOrPi -> TypedBinding -> (Telescope -> TCM a) -> TCM a
- addTypedPatterns :: List1 (NamedArg Binder) -> TCM a -> TCM a
- checkTacticAttribute :: LamOrPi -> Ranged Expr -> TCM Term
- checkPath :: NamedArg Binder -> Type -> Expr -> Type -> TCM Term
- checkLambda :: Comparison -> TypedBinding -> Expr -> Type -> TCM Term
- checkLambda' :: Comparison -> Range -> TypedBindingInfo -> List1 (NamedArg Binder) -> Type -> Expr -> Type -> TCM Term
- lambdaAddContext :: MonadAddContext m => Name -> ArgName -> Dom Type -> m a -> m a
- checkAbsurdLambda :: Comparison -> ExprInfo -> Hiding -> Expr -> Type -> TCM Term
- makeAbsurdLambda :: Range -> Dom Type -> Abs Type -> TCM QName
- checkExtendedLambda :: Comparison -> ExprInfo -> DefInfo -> QName -> List1 Clause -> Expr -> Type -> TCM Term
- catchIlltypedPatternBlockedOnMeta :: TCM a -> ((TCErr, Blocker) -> TCM a) -> TCM a
- expandModuleAssigns :: [Either Assign ModuleName] -> [Name] -> TCM Assigns
- checkRecordExpression :: Comparison -> RecordAssigns -> Expr -> Type -> ConOrigin -> TCM Term
- guessRecordType :: TCM Term -> Comparison -> Expr -> [Name] -> Type -> TCM Term
- checkRecordUpdate :: Comparison -> KwRange -> ExprInfo -> Expr -> Assigns -> Expr -> Type -> TCM Term
- checkRecordWhere :: Comparison -> KwRange -> ExprInfo -> Maybe Expr -> [LetBinding] -> Assigns -> Expr -> Type -> TCM Term
- checkLiteral :: Literal -> Type -> TCM Term
- appViewM :: Expr -> TCM AppView
- scopedExpr :: Expr -> TCM Expr
- checkExpr :: Expr -> Type -> TCM Term
- checkExpr' :: Comparison -> Expr -> Type -> TCM Term
- doQuoteTerm :: Comparison -> Term -> Type -> TCM Term
- unquoteM :: Expr -> Term -> Type -> TCM ()
- unquoteTactic :: Term -> Term -> Type -> TCM ()
- checkQuestionMark :: (Comparison -> Type -> TCM (MetaId, Term)) -> Comparison -> Type -> MetaInfo -> InteractionId -> TCM Term
- checkUnderscore :: MetaInfo -> Comparison -> Type -> TCM Term
- checkMeta :: MetaInfo -> (Comparison -> Type -> TCM (MetaId, Term)) -> Comparison -> Type -> TCM Term
- inferMeta :: MetaInfo -> (Comparison -> Type -> TCM (MetaId, Term)) -> TCM (AppHead, Type)
- checkOrInferMeta :: MetaInfo -> (Comparison -> Type -> TCM (MetaId, Term)) -> Maybe (Comparison, Type) -> TCM (Term, Type)
- domainFree :: ArgInfo -> Binder' Name -> LamBinding
- checkKnownArguments :: [NamedArg Expr] -> Args -> Type -> TCM (Args, Type)
- checkKnownArgument :: NamedArg Expr -> Args -> Type -> TCM (Args, Type)
- checkNamedArg :: NamedArg Expr -> Type -> TCM Term
- inferExpr :: Expr -> TCM (Term, Type)
- inferExpr' :: ExpandHidden -> Expr -> TCM (Term, Type)
- defOrVar :: Expr -> Bool
- checkDontExpandLast :: Comparison -> Expr -> Type -> TCM Term
- isModuleFreeVar :: Int -> TCM Bool
- inferExprForWith :: Arg Expr -> TCM (Term, Type)
- checkLetBindings' :: Foldable t => t LetBinding -> TCM a -> TCM a
- checkLetBinding' :: LetBinding -> TCM a -> TCM a
- checkLetBinding :: LetBinding -> TCM a -> TCM a
- checkLetBindings :: Foldable t => t LetBinding -> TCM a -> TCM a
Types
isType' :: Comparison -> Expr -> Sort -> TCM Type Source #
Check that an expression is a type.
* If c == CmpEq, the given sort must be the minimal sort.
* If c == CmpLeq, the given sort may be any bigger sort.
isType_ :: Expr -> TCM Type Source #
Check that an expression is a type and infer its (minimal) sort.
isTypeEqualTo :: Expr -> Type -> TCM Type Source #
Check that an expression is a type which is equal to a given type.
Telescopes
data ModTelOrigin Source #
We track whether a module telescope came from a data declaration because data telescopes cannot contain tactic arguments (because they result in slightly weird behaviour w.r.t. checking parameters of constructors are fully general)
Constructors
| ModTelData | |
| ModTelNotData |
Instances
| Show ModTelOrigin Source # | |
Defined in Mikan.TypeChecking.Rules.Term Methods showsPrec :: Int -> ModTelOrigin -> ShowS # show :: ModTelOrigin -> String # showList :: [ModTelOrigin] -> ShowS # | |
| Eq ModTelOrigin Source # | |
Defined in Mikan.TypeChecking.Rules.Term | |
checkGeneralizeTelescope Source #
Arguments
| :: ModTelOrigin | Origin of telescope (i.e. if it came from a data declaration) |
| -> Maybe ModuleName | The module the telescope belongs to (if any). |
| -> GeneralizeTelescope | Telescope to check and add to the context for the continuation. |
| -> ([Maybe Name] -> Telescope -> TCM a) | Continuation living in the extended context. |
| -> TCM a |
checkTelescope :: ModTelOrigin -> Telescope -> (Telescope -> TCM a) -> TCM a Source #
Type check a (module) telescope. Binds the variables defined by the telescope.
checkPiTelescope :: Telescope -> (Telescope -> TCM a) -> TCM a Source #
Type check the telescope of a dependent function type. Binds the resurrected variables defined by the telescope. The returned telescope is unmodified (not resurrected).
Flag to control resurrection on domains.
Constructors
| LamNotPi ModTelOrigin | We are checking a module telescope. We pass into the type world to check the domain type. This resurrects the whole context. |
| PiNotLam | We are checking a telescope in a Pi-type. We stay in the term world, but add resurrected domains to the context to check the remaining domains and codomain of the Pi-type. |
checkTelescope' :: LamOrPi -> Telescope -> (Telescope -> TCM a) -> TCM a Source #
Type check a telescope. Binds the variables defined by the telescope.
checkDomain :: LamOrPi -> Maybe Name -> List1 a -> Expr -> TCM Type Source #
Check the domain of a function type.
Used in checkTypedBindings and to typecheck A.Fun cases.
checkTypedBindings :: LamOrPi -> TypedBinding -> (Telescope -> TCM a) -> TCM a Source #
Check a typed binding and extends the context with the bound variables. The telescope passed to the continuation is valid in the original context.
Parametrized by a flag whether we check a typed lambda or a Pi. This flag is needed for irrelevance.
addTypedPatterns :: List1 (NamedArg Binder) -> TCM a -> TCM a Source #
After a typed binding has been checked, add the patterns it binds
checkTacticAttribute :: LamOrPi -> Ranged Expr -> TCM Term Source #
Check a tactic attribute. Should have type Term → TC ⊤.
Lambda abstractions
checkLambda :: Comparison -> TypedBinding -> Expr -> Type -> TCM Term Source #
Type check a lambda expression. "checkLambda bs e ty" means ( bs -> e) : ty
Arguments
| :: Comparison | cmp |
| -> Range | Range |
| -> TypedBindingInfo |
|
| -> List1 (NamedArg Binder) |
|
| -> Type |
|
| -> Expr | body |
| -> Type | target |
| -> TCM Term |
lambdaAddContext :: MonadAddContext m => Name -> ArgName -> Dom Type -> m a -> m a Source #
checkAbsurdLambda :: Comparison -> ExprInfo -> Hiding -> Expr -> Type -> TCM Term Source #
checkAbsurdLambda i h e t checks absurd lambda against type t.
Precondition: e = AbsurdLam i h
checkExtendedLambda :: Comparison -> ExprInfo -> DefInfo -> QName -> List1 Clause -> Expr -> Type -> TCM Term Source #
checkExtendedLambda i di qname cs e t check pattern matching lambda.
Precondition: e = ExtendedLam i di qname cs
catchIlltypedPatternBlockedOnMeta :: TCM a -> ((TCErr, Blocker) -> TCM a) -> TCM a Source #
Run a computation.
- If successful, that's it, we are done.
- If
NotADatatype aorCannotEliminateWithPattern p ais thrown and typeais blocked on some metax, reset any changes to the state and pass (the error and)xto the handler. - If
SplitError (UnificationStuck c tel us vs _)is thrown and the unification problemus =?= vs : telis blocked on some metaxpassxto the handler. - If another error was thrown or the type
ais not blocked, reraise the error.
Note that the returned meta might only exists in the state where the error was
thrown, thus, be an invalid MetaId in the current state.
Records
Arguments
| :: [Either Assign ModuleName] | Modules and field assignments. |
| -> [Name] | Names of fields of the record type. |
| -> TCM Assigns | Completed field assignments from modules. |
Picks up record field assignments from modules that export a definition that has the same name as the missing field.
checkRecordExpression Source #
Arguments
| :: Comparison | How do we related the inferred type of the record expression to the expected type? Subtype or equal type? |
| -> RecordAssigns |
|
| -> Expr | Must be |
| -> Type | Expected type of record expression. |
| -> ConOrigin | Is this a record expression or a |
| -> TCM Term | Record value in internal syntax. |
checkRecordExpression fs e t checks record construction against type t.
Precondition e = Rec _ fs.
Arguments
| :: Comparison | cmp |
| -> KwRange | Range of the |
| -> ExprInfo | ei |
| -> Expr | recexpr |
| -> Assigns | fs |
| -> Expr | e = RecUpdate ei recexpr fs |
| -> Type | Need not be reduced. |
| -> TCM Term |
checkRecordUpdate cmp ei recexpr fs e t
Preconditions: e = RecUpdate ei recexpr fs and t is reduced.
Arguments
| :: Comparison | |
| -> KwRange | |
| -> ExprInfo | ei |
| -> Maybe Expr | are we updating? |
| -> [LetBinding] | ds |
| -> Assigns | as |
| -> Expr | the overall expression (for resumption) |
| -> Type | |
| -> TCM Term |
Check a record where expression, pushing information about the
type of the fields obtained from the context into the let-bindings.
Literal
Terms
scopedExpr :: Expr -> TCM Expr Source #
Remove top layers of scope info of expression and set the scope accordingly
in the TCState.
Arguments
| :: Comparison | |
| -> Expr | |
| -> Type | Unreduced! |
| -> TCM Term |
Reflection
doQuoteTerm :: Comparison -> Term -> Type -> TCM Term Source #
unquoteTactic :: Term -> Term -> Type -> TCM () Source #
Run a tactic `tac : Term → TC ⊤` in a hole (second argument) of the type given by the third argument. Runs the continuation if successful.
Meta variables
Arguments
| :: (Comparison -> Type -> TCM (MetaId, Term)) | |
| -> Comparison | |
| -> Type | Not reduced! |
| -> MetaInfo | |
| -> InteractionId | |
| -> TCM Term |
Check an interaction point without arguments.
checkUnderscore :: MetaInfo -> Comparison -> Type -> TCM Term Source #
Check an underscore without arguments.
checkMeta :: MetaInfo -> (Comparison -> Type -> TCM (MetaId, Term)) -> Comparison -> Type -> TCM Term Source #
Type check a meta variable.
inferMeta :: MetaInfo -> (Comparison -> Type -> TCM (MetaId, Term)) -> TCM (AppHead, Type) Source #
Infer the type of a meta variable. If it is a new one, we create a new meta for its type.
checkOrInferMeta :: MetaInfo -> (Comparison -> Type -> TCM (MetaId, Term)) -> Maybe (Comparison, Type) -> TCM (Term, Type) Source #
Type check a meta variable. If its type is not given, we return its type, or a fresh one, if it is a new meta. If its type is given, we check that the meta has this type, and we return the same type.
domainFree :: ArgInfo -> Binder' Name -> LamBinding Source #
Turn a domain-free binding (e.g. lambda) into a domain-full one, by inserting an underscore for the missing type.
Arguments
| :: [NamedArg Expr] | User-supplied arguments (hidden ones may be missing). |
| -> Args | Inferred arguments (including hidden ones). |
| -> Type | Type of the head (must be Pi-type with enough domains). |
| -> TCM (Args, Type) | Remaining inferred arguments, remaining type. |
Check arguments whose value we already know.
This function can be used to check user-supplied parameters we have already computed by inference.
Precondition: The type t of the head has enough domains.
Arguments
| :: NamedArg Expr | User-supplied argument. |
| -> Args | Inferred arguments (including hidden ones). |
| -> Type | Type of the head (must be Pi-type with enough domains). |
| -> TCM (Args, Type) | Remaining inferred arguments, remaining type. |
Check an argument whose value we already know.
inferExpr :: Expr -> TCM (Term, Type) Source #
Infer the type of an expression. Implemented by checking against a meta variable. Except for neutrals, for them a polymorphic type is inferred.
inferExpr' :: ExpandHidden -> Expr -> TCM (Term, Type) Source #
checkDontExpandLast :: Comparison -> Expr -> Type -> TCM Term Source #
Used to check aliases f = e.
Switches off ExpandLast for the checking of top-level application.
isModuleFreeVar :: Int -> TCM Bool Source #
Check whether a de Bruijn index is bound by a module telescope.
inferExprForWith :: Arg Expr -> TCM (Term, Type) Source #
Infer the type of an expression, and if it is of the form
{tel} -> D vs for some datatype D then insert the hidden
arguments. Otherwise, leave the type polymorphic.
Let bindings
checkLetBindings' :: Foldable t => t LetBinding -> TCM a -> TCM a Source #
checkLetBinding' :: LetBinding -> TCM a -> TCM a Source #
checkLetBinding :: LetBinding -> TCM a -> TCM a Source #
Version of checkLetBinding which traces the fact that we're checking each binding in the Call.
checkLetBindings :: Foldable t => t LetBinding -> TCM a -> TCM a Source #