Agda-2.6.1: A dependently typed functional programming language and proof assistant

Safe Haskell None Haskell2010

Agda.TypeChecking.Free.Lazy

Description

Computing the free variables of a term lazily.

We implement a reduce (traversal into monoid) over internal syntax for a generic collection (monoid with singletons). This should allow a more efficient test for the presence of a particular variable.

Worst-case complexity does not change (i.e. the case when a variable does not occur), but best case-complexity does matter. For instance, see mkAbs: each time we construct a dependent function type, we check whether it is actually dependent.

The distinction between rigid and strongly rigid occurrences comes from: Jason C. Reed, PhD thesis, 2009, page 96 (see also his LFMTP 2009 paper)

The main idea is that x = t(x) is unsolvable if x occurs strongly rigidly in t. It might have a solution if the occurrence is not strongly rigid, e.g.

x = f -> suc (f (x ( y -> k))) has x = f -> suc (f (suc k))

Jason C. Reed, PhD thesis, page 106

Under coinductive constructors, occurrences are never strongly rigid. Also, function types and lambdas do not establish strong rigidity. Only inductive constructors do so. (See issue 1271).

For further reading on semirings and semimodules for variable occurrence, see e.g. Conor McBrides "I got plenty of nuttin'" (Wadlerfest 2016). There, he treats the "quantity" dimension of variable occurrences.

The semiring has an additive operation for combining occurrences of subterms, and a multiplicative operation of representing function composition. E.g. if variable x appears o in term u, but u appears in context q in term t then occurrence of variable x coming from u is accounted for as q o in t.

Consider example (λ{ x → (x,x)}) y:

• Variable x occurs once unguarded in x.
• It occurs twice unguarded in the aggregation x x
• Inductive constructor , turns this into two strictly rigid occurrences.

If , is a record constructor, then we stay unguarded.

• The function ({λ x → (x,x)}) provides a context for variable y. This context can be described as weakly rigid with quantity two.
• The final occurrence of y is obtained as composing the context with the occurrence of y in itself (which is the unit for composition). Thus, y occurs weakly rigid with quantity two.

It is not a given that the context can be described in the same way as the variable occurrence. However, for quantity it is the case and we obtain a semiring of occurrences with 0, 1, and even ω, which is an absorptive element for addition.

Synopsis

# Set of meta variables.

newtype MetaSet Source #

A set of meta variables. Forms a monoid under union.

Constructors

 MetaSet FieldstheMetaSet :: IntSet
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(==) :: MetaSet -> MetaSet -> Bool #(/=) :: MetaSet -> MetaSet -> Bool # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowList :: [MetaSet] -> ShowS # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsstimes :: Integral b => b -> MetaSet -> MetaSet # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsmconcat :: [MetaSet] -> MetaSet # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods

foldrMetaSet :: (MetaId -> a -> a) -> a -> MetaSet -> a Source #

# Flexible and rigid occurrences (semigroup)

data FlexRig' a Source #

Depending on the surrounding context of a variable, it's occurrence can be classified as flexible or rigid, with finer distinctions.

The constructors are listed in increasing order (wrt. information content).

Constructors

 Flexible a In arguments of metas. The set of metas is used by 'NonLinMatch' to generate the right blocking information. The semantics is that the status of a variable occurrence may change if one of the metas in the set gets solved. We may say the occurrence is tainted by the meta variables in the set. WeaklyRigid In arguments to variables and definitions. Unguarded In top position, or only under inductive record constructors (unit). StronglyRigid Under at least one and only inductive constructors.
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsfmap :: (a -> b) -> FlexRig' a -> FlexRig' b #(<\$) :: a -> FlexRig' b -> FlexRig' a # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsfold :: Monoid m => FlexRig' m -> m #foldMap :: Monoid m => (a -> m) -> FlexRig' a -> m #foldr :: (a -> b -> b) -> b -> FlexRig' a -> b #foldr' :: (a -> b -> b) -> b -> FlexRig' a -> b #foldl :: (b -> a -> b) -> b -> FlexRig' a -> b #foldl' :: (b -> a -> b) -> b -> FlexRig' a -> b #foldr1 :: (a -> a -> a) -> FlexRig' a -> a #foldl1 :: (a -> a -> a) -> FlexRig' a -> a #toList :: FlexRig' a -> [a] #null :: FlexRig' a -> Bool #length :: FlexRig' a -> Int #elem :: Eq a => a -> FlexRig' a -> Bool #maximum :: Ord a => FlexRig' a -> a #minimum :: Ord a => FlexRig' a -> a #sum :: Num a => FlexRig' a -> a #product :: Num a => FlexRig' a -> a # LensFlexRig a (FlexRig' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Eq a => Eq (FlexRig' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(==) :: FlexRig' a -> FlexRig' a -> Bool #(/=) :: FlexRig' a -> FlexRig' a -> Bool # Show a => Show (FlexRig' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowsPrec :: Int -> FlexRig' a -> ShowS #show :: FlexRig' a -> String #showList :: [FlexRig' a] -> ShowS # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodssingleton :: (Variable, FlexRig' ()) -> FlexRigMap Source #

class LensFlexRig a o | o -> a where Source #

Methods

Instances
 LensFlexRig a (VarOcc' a) Source # Access to varFlexRig in VarOcc'. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods LensFlexRig a (FlexRig' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods LensFlexRig a (FreeEnv' a b c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodslensFlexRig :: Lens' (FlexRig' a) (FreeEnv' a b c) Source #

addFlexRig :: Semigroup a => FlexRig' a -> FlexRig' a -> FlexRig' a Source #

FlexRig aggregation (additive operation of the semiring). For combining occurrences of the same variable in subterms. This is a refinement of the max operation for FlexRig which would work if Flexible did not have the MetaSet as an argument. Now, to aggregate two Flexible occurrences, we union the involved MetaSets.

Unit for addFlexRig.

Absorptive for addFlexRig.

composeFlexRig :: Semigroup a => FlexRig' a -> FlexRig' a -> FlexRig' a Source #

FlexRig composition (multiplicative operation of the semiring). For accumulating the context of a variable.

Flexible is dominant. Once we are under a meta, we are flexible regardless what else comes. We taint all variable occurrences under a meta by this meta.

WeaklyRigid is next in strength. Destroys strong rigidity.

StronglyRigid is still dominant over Unguarded.

Unguarded is the unit. It is the top (identity) context.

Unit for composeFlexRig.

# Multi-dimensional feature vector for variable occurrence (semigroup)

data VarOcc' a Source #

Occurrence of free variables is classified by several dimensions. Currently, we have FlexRig and Modality.

Constructors

 VarOcc FieldsvarFlexRig :: FlexRig' a varModality :: Modality
Instances
 LensFlexRig a (VarOcc' a) Source # Access to varFlexRig in VarOcc'. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Eq a => Eq (VarOcc' a) Source # Equality up to origin. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(==) :: VarOcc' a -> VarOcc' a -> Bool #(/=) :: VarOcc' a -> VarOcc' a -> Bool # Show a => Show (VarOcc' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowsPrec :: Int -> VarOcc' a -> ShowS #show :: VarOcc' a -> String #showList :: [VarOcc' a] -> ShowS # Semigroup a => Semigroup (VarOcc' a) Source # The default way of aggregating free variable info from subterms is by adding the variable occurrences. For instance, if we have a pair (t₁,t₂) then and t₁ has o₁ the occurrences of a variable x and t₂ has o₂ the occurrences of the same variable, then (t₁,t₂) has mappend o₁ o₂ occurrences of that variable.From counting Quantity, we extrapolate this to FlexRig and Relevance: we care most about about StronglyRigid Relevant occurrences. E.g., if t₁ has a StronglyRigid occurrence and t₂ a Flexible occurrence, then (t₁,t₂) still has a StronglyRigid occurrence. Analogously, Relevant occurrences count most, as we wish e.g. to forbid relevant occurrences of variables that are declared to be irrelevant.VarOcc' forms a semiring, and this monoid is the addition of the semiring. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(<>) :: VarOcc' a -> VarOcc' a -> VarOcc' a #sconcat :: NonEmpty (VarOcc' a) -> VarOcc' a #stimes :: Integral b => b -> VarOcc' a -> VarOcc' a # (Semigroup a, Monoid a) => Monoid (VarOcc' a) Source # The neutral element for variable occurrence aggregation is least serious occurrence: flexible, irrelevant. This is also the absorptive element for composeVarOcc, if we ignore the MetaSet in Flexible. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsmappend :: VarOcc' a -> VarOcc' a -> VarOcc' a #mconcat :: [VarOcc' a] -> VarOcc' a # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsmapRelevance :: (Relevance -> Relevance) -> VarOcc' a -> VarOcc' a Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsmapQuantity :: (Quantity -> Quantity) -> VarOcc' a -> VarOcc' a Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsmapModality :: (Modality -> Modality) -> VarOcc' a -> VarOcc' a Source #

The absorptive element of variable occurrence under aggregation: strongly rigid, relevant.

composeVarOcc :: Semigroup a => VarOcc' a -> VarOcc' a -> VarOcc' a Source #

First argument is the outer occurrence (context) and second is the inner. This multiplicative operation is to modify an occurrence under a context.

# Storing variable occurrences (semimodule).

class (Singleton MetaId a, Semigroup a, Monoid a, Semigroup c, Monoid c) => IsVarSet a c | c -> a where Source #

Any representation c of a set of variables need to be able to be modified by a variable occurrence. This is to ensure that free variable analysis is compositional. For instance, it should be possible to compute fv (v [u/x]) from fv v and fv u.

In algebraic terminology, a variable set a needs to be (almost) a left semimodule to the semiring VarOcc'.

Methods

withVarOcc :: VarOcc' a -> c -> c Source #

Laws * Respects monoid operations:  withVarOcc o mempty == mempty withVarOcc o (x <> y) == withVarOcc o x <> withVarOcc o y  * Respects VarOcc composition:  withVarOcc oneVarOcc = id withVarOcc (composeVarOcc o1 o2) = withVarOcc o1 . withVarOcc o2  * Respects VarOcc aggregation:  withVarOcc (o1 <> o2) x = withVarOcc o1 x <> withVarOcc o2 x  Since the corresponding unit law may fail,  withVarOcc mempty x = mempty  it is not quite a semimodule.

Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free MethodswithVarOcc :: VarOcc' () -> All -> All Source # Source # Instance detailsDefined in Agda.TypeChecking.Free MethodswithVarOcc :: VarOcc' () -> Any -> Any Source # Source # Compose everything with the varFlexRig part of the VarOcc'. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.MetaVars.Occurs Methods IsVarSet () [Int] Source # Instance detailsDefined in Agda.TypeChecking.Free MethodswithVarOcc :: VarOcc' () -> [Int] -> [Int] Source # (Singleton MetaId a, Semigroup a, Monoid a) => IsVarSet a (VarMap' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodswithVarOcc :: VarOcc' a -> VarMap' a -> VarMap' a Source #

type TheVarMap' a = IntMap (VarOcc' a) Source #

Representation of a variable set as map from de Bruijn indices to VarOcc'.

newtype VarMap' a Source #

Constructors

 VarMap FieldstheVarMap :: TheVarMap' a
Instances
 Source # A "set"-style Singleton instance with default/initial variable occurrence. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods (Singleton MetaId a, Semigroup a, Monoid a) => IsVarSet a (VarMap' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodswithVarOcc :: VarOcc' a -> VarMap' a -> VarMap' a Source # Eq a => Eq (VarMap' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(==) :: VarMap' a -> VarMap' a -> Bool #(/=) :: VarMap' a -> VarMap' a -> Bool # Show a => Show (VarMap' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowsPrec :: Int -> VarMap' a -> ShowS #show :: VarMap' a -> String #showList :: [VarMap' a] -> ShowS # Semigroup a => Semigroup (VarMap' a) Source # Proper monoid instance for VarMap rather than inheriting the broken one from IntMap. We combine two occurrences of a variable using mappend. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(<>) :: VarMap' a -> VarMap' a -> VarMap' a #sconcat :: NonEmpty (VarMap' a) -> VarMap' a #stimes :: Integral b => b -> VarMap' a -> VarMap' a # Semigroup a => Monoid (VarMap' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsmappend :: VarMap' a -> VarMap' a -> VarMap' a #mconcat :: [VarMap' a] -> VarMap' a #

# Simple flexible/rigid variable collection.

type TheFlexRigMap = IntMap (FlexRig' ()) Source #

Keep track of FlexRig for every variable, but forget the involved meta vars.

newtype FlexRigMap Source #

Constructors

 FlexRigMap FieldstheFlexRigMap :: TheFlexRigMap
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowList :: [FlexRigMap] -> ShowS # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsstimes :: Integral b => b -> FlexRigMap -> FlexRigMap # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsmconcat :: [FlexRigMap] -> FlexRigMap # Source # Compose everything with the varFlexRig part of the VarOcc'. Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodssingleton :: (Variable, FlexRig' ()) -> FlexRigMap Source #

# Environment for collecting free variables.

Where should we skip sorts in free variable analysis?

Constructors

 IgnoreNot Do not skip. IgnoreInAnnotations Skip when annotation to a type. IgnoreAll Skip unconditionally.
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowList :: [IgnoreSorts] -> ShowS #

data FreeEnv' a b c Source #

The current context.

Constructors

 FreeEnv FieldsfeExtra :: !bAdditional context, e.g., whether to ignore free variables in sorts.feFlexRig :: !(FlexRig' a)Are we flexible or rigid?feModality :: !ModalityWhat is the current relevance and quantity?feSingleton :: Maybe Variable -> cMethod to return a single variable.
Instances
 LensFlexRig a (FreeEnv' a b c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodslensFlexRig :: Lens' (FlexRig' a) (FreeEnv' a b c) Source # LensRelevance (FreeEnv' a b c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsgetRelevance :: FreeEnv' a b c -> Relevance Source #setRelevance :: Relevance -> FreeEnv' a b c -> FreeEnv' a b c Source #mapRelevance :: (Relevance -> Relevance) -> FreeEnv' a b c -> FreeEnv' a b c Source # LensQuantity (FreeEnv' a b c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsgetQuantity :: FreeEnv' a b c -> Quantity Source #setQuantity :: Quantity -> FreeEnv' a b c -> FreeEnv' a b c Source #mapQuantity :: (Quantity -> Quantity) -> FreeEnv' a b c -> FreeEnv' a b c Source # LensModality (FreeEnv' a b c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsgetModality :: FreeEnv' a b c -> Modality Source #setModality :: Modality -> FreeEnv' a b c -> FreeEnv' a b c Source #mapModality :: (Modality -> Modality) -> FreeEnv' a b c -> FreeEnv' a b c Source # (Applicative m, Semigroup c) => Semigroup (FreeT a b m c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(<>) :: FreeT a b m c -> FreeT a b m c -> FreeT a b m c #sconcat :: NonEmpty (FreeT a b m c) -> FreeT a b m c #stimes :: Integral b0 => b0 -> FreeT a b m c -> FreeT a b m c # (Functor m, Applicative m, Monad m, Semigroup c, Monoid c) => Monoid (FreeT a b m c) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodsmempty :: FreeT a b m c #mappend :: FreeT a b m c -> FreeT a b m c -> FreeT a b m c #mconcat :: [FreeT a b m c] -> FreeT a b m c #

type SingleVar c = Variable -> c Source #

Ignore free variables in sorts.

initFreeEnv :: Monoid c => b -> SingleVar c -> FreeEnv' a b c Source #

The initial context.

type FreeT a b m c = ReaderT (FreeEnv' a b c) m c Source #

runFreeM :: IsVarSet a c => SingleVar c -> IgnoreSorts -> FreeM a c -> c Source #

Run function for FreeM.

variable :: (Monad m, IsVarSet a c) => Int -> FreeT a b m c Source #

Base case: a variable.

Subtract, but return Nothing if result is negative.

underBinder :: MonadReader (FreeEnv' a b c) m => m z -> m z Source #

Going under a binder.

underBinder' :: MonadReader (FreeEnv' a b c) m => Nat -> m z -> m z Source #

Going under n binders.

underModality :: (MonadReader r m, LensModality r, LensModality o) => o -> m z -> m z Source #

Changing the Modality.

underRelevance :: (MonadReader r m, LensRelevance r, LensRelevance o) => o -> m z -> m z Source #

Changing the Relevance.

underFlexRig :: (MonadReader r m, LensFlexRig a r, Semigroup a, LensFlexRig a o) => o -> m z -> m z Source #

Changing the FlexRig context.

underConstructor :: (MonadReader r m, LensFlexRig a r, Semigroup a) => ConHead -> m z -> m z Source #

What happens to the variables occurring under a constructor?

# Recursively collecting free variables.

class Free t where Source #

Gather free variables in a collection.

Minimal complete definition

Nothing

Methods

freeVars' :: IsVarSet a c => t -> FreeM a c Source #

freeVars' :: (t ~ f b, Foldable f, Free b) => IsVarSet a c => t -> FreeM a c Source #

Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => EqualityView -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Clause -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => LevelAtom -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => PlusLevel -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Level -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Sort -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Term -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base MethodsfreeVars' :: IsVarSet a c => Candidate -> FreeM a c Source # Source # Instance details MethodsfreeVars' :: IsVarSet a c => NLPSort -> FreeM a c Source # Source # Instance details MethodsfreeVars' :: IsVarSet a c => NLPType -> FreeM a c Source # Source # Only computes free variables that are not bound (see nlPatVars), i.e., those in a PTerm. Instance details MethodsfreeVars' :: IsVarSet a c => NLPat -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base MethodsfreeVars' :: IsVarSet a c => DisplayTerm -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base MethodsfreeVars' :: IsVarSet a c => DisplayForm -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base MethodsfreeVars' :: IsVarSet a c => CompareAs -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base MethodsfreeVars' :: IsVarSet a c => Constraint -> FreeM a c Source # Source # Instance detailsDefined in Agda.TypeChecking.Level MethodsfreeVars' :: IsVarSet a c => SingleLevel -> FreeM a c Source # Free t => Free [t] Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => [t] -> FreeM a c Source # Free t => Free (Maybe t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Maybe t -> FreeM a c Source # Free t => Free (Arg t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Arg t -> FreeM a c Source # Free t => Free (WithHiding t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => WithHiding t -> FreeM a c Source # Free t => Free (Tele t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Tele t -> FreeM a c Source # Free t => Free (Type' t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Type' t -> FreeM a c Source # Free t => Free (Abs t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Abs t -> FreeM a c Source # Free t => Free (Elim' t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Elim' t -> FreeM a c Source # Free t => Free (Dom t) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => Dom t -> FreeM a c Source # (Free t, Free u) => Free (t, u) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => (t, u) -> FreeM a c Source # (Free t, Free u, Free v) => Free (t, u, v) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet a c => (t, u, v) -> FreeM a c Source #

# Orphan instances

 Source # Instance details Methodssingleton :: MetaId -> () Source #