Mikan
Safe HaskellNone
LanguageHaskell2010

Mikan.TypeChecking.Monad.Signature

Synopsis

Documentation

addConstant :: QName -> Definition -> TCM () Source #

Add a constant to the signature. Lifts the definition to top level.

addConstant' :: QName -> ArgInfo -> Type -> Defn -> TCM () Source #

A combination of addConstant and defaultDefn. The Language does not need to be supplied.

setTerminates :: MonadTCState m => QName -> Maybe Bool -> m () Source #

Set termination info of a defined function symbol.

setCompiledClauses :: QName -> CompiledClauses -> TCM () Source #

Set CompiledClauses of a defined function symbol.

setSplitTree :: QName -> SplitTree -> TCM () Source #

Set SplitTree of a defined function symbol.

modifyFunClauses :: QName -> ([Clause] -> [Clause]) -> TCM () Source #

Modify the clauses of a function.

addClauses :: (MonadConstraint m, MonadTCState m) => QName -> [Clause] -> m () Source #

Lifts clauses to the top-level and adds them to definition. Also adjusts the funCopatternLHS field if necessary.

addPragma :: BackendName -> QName -> String -> TCM () Source #

Add a compiler pragma `{-# COMPILE backend name text #-}`

addSection :: ModuleName -> TCM () Source #

Add a section to the signature.

The current context will be stored as the cumulative module parameters for this section, and a module checkpoint entry will be added into the module checkpoint stack.

getSection :: ReadTCState m => ModuleName -> m (Maybe Section) Source #

Get a section.

Why Maybe? The reason is that we look up all prefixes of a module to compute number of parameters, and for hierarchical top-level modules, A.B.C say, A and A.B do not exist.

lookupSection :: ReadTCState m => ModuleName -> m Telescope Source #

Lookup a section telescope.

If it doesn't exist, like in hierarchical top-level modules, the section telescope is empty.

addDisplayForms :: QName -> TCM () Source #

Add display forms for a name f copied by a module application. Essentially if f can reduce to

λ xs → A.B.C.f vs

by unfolding module application copies (defCopy), then we add a display form

A.B.C.f vs ==> f xs

Invoking addDisplayForms x will add a display form for each copy x transitively reduces to. E.g. consider the following iterated module application. module M0 (n : Nat) where b : Bool b = n > 42 module M1 (n : Nat) = M0 (suc n) module M2 (n : Nat) = M1 (suc n) module M3 (n : Nat) = M2 (suc n)

For the first copy M1.b n = M0.b (suc n) we add the display form M0.b (suc n) --> M1.b n.

For the second copy M2.b n = M1.b (suc n) we first add display form M1.b (suc n) --> M2.b n and for the further unfolding we add display form M0.b (suc (suc n)) --> M2.b n.

For the third copy M3.b n = M2.b (suc n) we add display forms M2.b (suc n) --> M3.b n, M1.b (suc (suc n)) --> M3.b n and M0.b (suc (suc (suc n))) --> M3.b n.

applySection Source #

Arguments

:: ModuleName

Name of new module defined by the module macro.

-> Telescope

Parameters of new module.

-> ModuleName

Name of old module applied to arguments.

-> Args

Arguments of module application.

-> ScopeCopyInfo

Imported names and modules

-> TCM () 

Module application (followed by module parameter abstraction).

addDisplayForm :: QName -> DisplayForm -> TCM () Source #

Add a display form to a definition (could be in this or imported signature).

class ChaseDisplayForms a where Source #

Find all names used (recursively) by display forms of a given name.

Methods

chaseDisplayForms Source #

Arguments

:: a

Search this recursively for display form names.

-> Set QName

Already processed names (accumulator).

-> TCM (Set QName)

Found names (superset of accumulator)

singleConstructorType :: QName -> TCM Bool Source #

Does the given constructor come from a single-constructor type?

Precondition: The name has to refer to a constructor.

data SigError Source #

Signature lookup errors.

Constructors

SigUnknown String

The name is not in the signature; default error message.

SigAbstract

The name is not available, since it is abstract.

sigError :: (HasCallStack, MonadDebug m) => QName -> m a -> SigError -> m a Source #

An eliminator for SigError. All constructors except for SigAbstract are assumed to be impossible.

class (Functor m, Applicative m, HasOptions m, MonadDebug m, MonadTCEnv m) => HasConstInfo (m :: Type -> Type) where Source #

Minimal complete definition

Nothing

Methods

getConstInfo :: QName -> m Definition Source #

Lookup the definition of a name. The result is a closed thing, all free variables have been abstracted over.

getConstInfo' :: QName -> m (Either SigError Definition) Source #

Version that reports exceptions:

default getConstInfo' :: forall (n :: Type -> Type) (t :: (Type -> Type) -> Type -> Type). (HasCallStack, HasConstInfo n, MonadTrans t, m ~ t n) => QName -> m (Either SigError Definition) Source #

Instances

Instances details
HasConstInfo TerM Source # 
Instance details

Defined in Mikan.Termination.Monad

HasConstInfo ReduceM Source # 
Instance details

Defined in Mikan.TypeChecking.Reduce.Monad

HasConstInfo TCM Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (BlockT m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (NamesT m) Source # 
Instance details

Defined in Mikan.TypeChecking.Names

HasConstInfo m => HasConstInfo (ListT m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (ChangeT m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (MaybeT m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (ReaderT r m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (StateT s m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

(Monoid w, HasConstInfo m) => HasConstInfo (WriterT w m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (ExceptT err m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (IdentityT m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (ReaderT r m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

HasConstInfo m => HasConstInfo (StateT s m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

(Monoid w, HasConstInfo m) => HasConstInfo (WriterT w m) Source # 
Instance details

Defined in Mikan.TypeChecking.Monad.Signature

getOriginalConstInfo :: (HasCallStack, HasConstInfo m) => QName -> m Definition Source #

The computation getConstInfo sometimes tweaks the returned Definition, depending on the current Language and the Language of the Definition. This variant of getConstInfo does not perform any tweaks.

getOriginalProjection :: (HasCallStack, HasConstInfo m) => QName -> m QName Source #

Get the original name of the projection (the current one could be from a module application).

getPolarity :: (HasCallStack, HasConstInfo m) => QName -> m [Polarity] Source #

Look up the polarity of a definition.

getPolarity' :: (HasCallStack, HasConstInfo m) => Comparison -> QName -> m [Polarity] Source #

Look up polarity of a definition and compose with polarity represented by Comparison.

setPolarity :: (MonadTCState m, MonadDebug m) => QName -> [Polarity] -> m () Source #

Set the polarity of a definition.

getForcedArgs :: HasConstInfo m => QName -> m [IsForced] Source #

Look up the forced arguments of a definition.

getArgOccurrence :: HasCallStack => QName -> Nat -> TCM Occurrence Source #

Get argument occurrence info for argument i of definition d (never fails).

setArgOccurrences :: MonadTCState m => QName -> [Occurrence] -> m () Source #

Sets the defArgOccurrences for the given identifier (which should already exist in the signature).

addDataCons :: QName -> [QName] -> TCM () Source #

add data constructors to a datatype

getMutual :: QName -> TCM (Maybe [QName]) Source #

Get the mutually recursive identifiers of a symbol from the signature.

getMutual_ :: Defn -> Maybe [QName] Source #

Get the mutually recursive identifiers from a Definition.

setMutual :: QName -> [QName] -> TCM () Source #

Set the mutually recursive identifiers.

TODO: This produces data of quadratic size (which has to be processed upon serialization). Presumably qs is usually short, but in some cases (for instance for generated code) it may be long. It would be better to assign a unique identifier to each SCC, and store the names separately.

mutuallyRecursive :: QName -> QName -> TCM Bool Source #

Check whether two definitions are mutually recursive.

definitelyNonRecursive_ :: Defn -> Bool Source #

A function, data, or record definition is definitely not recursive if it is not even mutually recursive with itself.

getCurrentModuleFreeVars :: TCM Nat Source #

Get the number of parameters to the current module.

getDefFreeVars :: (ReadTCState m, MonadTCEnv m) => QName -> m Nat Source #

Compute the number of free variables of a defined name. This is the sum of number of parameters shared with the current module and the number of anonymous variables (if the name comes from a let-bound module).

moduleParamsToApply :: (HasOptions m, MonadTCEnv m, ReadTCState m, MonadDebug m) => ModuleName -> m Args Source #

Compute the context variables to apply a definition to.

We have to insert the module telescope of the common prefix of the current module and the module where the definition comes from. (Properly raised to the current context.)

Example: module M₁ Γ where module M₁ Δ where f = ... module M₃ Θ where ... M₁.M₂.f [insert Γ raised by Θ]

inFreshModuleIfFreeParams :: TCM a -> TCM a Source #

Unless all variables in the context are module parameters, create a fresh module to capture the non-module parameters. Used when unquoting to make sure generated definitions work properly.

instantiateDef :: (HasConstInfo m, ReadTCState m) => Definition -> m Definition Source #

Instantiate a closed definition with the correct part of the current context.

alwaysMakeAbstract :: Definition -> Maybe Definition Source #

Return the abstract view of a definition, regardless of whether the definition would be treated abstractly.

inAbstractMode :: MonadTCEnv m => m a -> m a Source #

Enter abstract mode. Abstract definition in the current module are transparent.

inConcreteMode :: MonadTCEnv m => m a -> m a Source #

Not in abstract mode. All abstract definitions are opaque.

ignoreAbstractMode :: MonadTCEnv m => m a -> m a Source #

Ignore abstract mode. All abstract definitions are transparent.

underOpaqueId :: MonadTCEnv m => OpaqueId -> m a -> m a Source #

Go under the given opaque block. The unfolding set will turn opaque definitions transparent.

notUnderOpaque :: MonadTCEnv m => m a -> m a Source #

Outside of any opaque blocks.

inConcreteOrAbstractMode :: HasConstInfo m => QName -> (Definition -> m a) -> m a Source #

Enter the reducibility environment associated with a definition: The environment will have the same concreteness as the name, and we will be in the opaque block enclosing the name, if any.

typeOfConst :: (HasConstInfo m, ReadTCState m) => QName -> m Type Source #

Get type of a constant, instantiated to the current context.

droppedPars :: Definition -> Int Source #

The number of dropped parameters for a definition. 0 except for projection(-like) functions and constructors.

isProjection :: HasConstInfo m => QName -> m (Maybe Projection) Source #

Is it the name of a record projection or field or a projection-like function?

isProjectionDefn :: Defn -> Maybe Projection Source #

Is it a record projection or field or a projection-like function?

isProjectionDefinition :: Definition -> Maybe Projection Source #

Is it a record projection or field or a projection-like function?

isInlineFun :: Defn -> Bool Source #

Is it a function marked INLINE?

isProperProjection :: Defn -> Bool Source #

Returns True if we are dealing with a proper projection, i.e., not a projection-like function nor a record field value (projection applied to argument).

isProperProjection_ :: Projection -> Bool Source #

Returns True if we are dealing with a proper projection, i.e., not a projection-like function nor a record field value (projection applied to argument).

projectionArgs :: Definition -> Int Source #

Number of dropped initial arguments of a projection(-like) function.

usesCopatterns :: HasConstInfo m => QName -> m Bool Source #

Check whether a definition uses copatterns.

applyDef :: HasConstInfo m => ProjOrigin -> QName -> Arg Term -> m Term Source #

Apply a function f to its first argument, producing the proper postfix projection if f is a projection.