Safe Haskell | Safe |
---|---|
Language | Haskell98 |
- data Type n
- data TypeSum n
- = TypeSumBot {
- typeSumKind :: !(Kind n)
- | TypeSumSet {
- typeSumKind :: !(Kind n)
- typeSumElems :: !(Array TyConHash (Set (TypeSumVarCon n)))
- typeSumBoundNamed :: !(Map n (Kind n))
- typeSumBoundAnon :: !(Map Int (Kind n))
- typeSumSpill :: ![Type n]
- = TypeSumBot {
- data TyConHash = TyConHash !Int
- data TypeSumVarCon n
- = TypeSumVar !(Bound n)
- | TypeSumCon !(Bound n) !(Kind n)
- data Binder n
- data Bind n
- data Bound n
- data TyCon n
- = TyConSort !SoCon
- | TyConKind !KiCon
- | TyConWitness !TwCon
- | TyConSpec !TcCon
- | TyConBound !(Bound n) !(Kind n)
- | TyConExists !Int !(Kind n)
- data SoCon
- data KiCon
- data TwCon
- data TcCon
- type Sort n = Type n
- type Kind n = Type n
- type Region n = Type n
- type Effect n = Type n
- type Closure n = Type n
- isBNone :: Bind n -> Bool
- isBAnon :: Bind n -> Bool
- isBName :: Bind n -> Bool
- isTVar :: Type n -> Bool
- isBot :: Type n -> Bool
- isAtomT :: Type n -> Bool
- isTExists :: Type n -> Bool
- isDataKind :: Kind n -> Bool
- isRegionKind :: Region n -> Bool
- isEffectKind :: Kind n -> Bool
- isClosureKind :: Kind n -> Bool
- isWitnessKind :: Kind n -> Bool
- isAlgDataType :: Eq n => Type n -> Bool
- isWitnessType :: Eq n => Type n -> Bool
- isConstWitType :: Eq n => Type n -> Bool
- isMutableWitType :: Eq n => Type n -> Bool
- isDistinctWitType :: Eq n => Type n -> Bool
- isReadEffect :: Effect n -> Bool
- isWriteEffect :: Effect n -> Bool
- isAllocEffect :: Effect n -> Bool
- isSomeReadEffect :: Effect n -> Bool
- isSomeWriteEffect :: Effect n -> Bool
- isSomeAllocEffect :: Effect n -> Bool
- equivT :: Ord n => EnvT n -> Type n -> Type n -> Bool
- equivWithBindsT :: Ord n => EnvT n -> [Bind n] -> [Bind n] -> Type n -> Type n -> Bool
- equivTyCon :: Eq n => TyCon n -> TyCon n -> Bool
- subsumesT :: Ord n => EnvT n -> Kind n -> Type n -> Type n -> Bool
- crushSomeT :: Ord n => EnvT n -> Type n -> Type n
- crushEffect :: Ord n => EnvT n -> Effect n -> Effect n
- takeNameOfBind :: Bind n -> Maybe n
- typeOfBind :: Bind n -> Type n
- replaceTypeOfBind :: Type n -> Bind n -> Bind n
- binderOfBind :: Bind n -> Binder n
- makeBindFromBinder :: Binder n -> Type n -> Bind n
- partitionBindsByType :: Eq n => [Bind n] -> [([Binder n], Type n)]
- takeNameOfBound :: Bound n -> Maybe n
- takeTypeOfBound :: Bound n -> Maybe (Type n)
- boundMatchesBind :: Eq n => Bound n -> Bind n -> Bool
- namedBoundMatchesBind :: Eq n => Bound n -> Bind n -> Bool
- takeSubstBoundOfBind :: Bind n -> Maybe (Bound n)
- takeSubstBoundsOfBinds :: [Bind n] -> [Bound n]
- replaceTypeOfBound :: Type n -> Bound n -> Bound n
- sComp :: Type n
- sProp :: Type n
- kData :: Type n
- kRegion :: Type n
- kEffect :: Type n
- kClosure :: Type n
- kWitness :: Type n
- kFun :: Kind n -> Kind n -> Kind n
- kFuns :: [Kind n] -> Kind n -> Kind n
- takeKFun :: Kind n -> Maybe (Kind n, Kind n)
- takeKFuns :: Kind n -> ([Kind n], Kind n)
- takeKFuns' :: Kind n -> [Kind n]
- takeResultKind :: Kind n -> Kind n
- tForall :: Kind n -> (Type n -> Type n) -> Type n
- tForall' :: Int -> Kind n -> (Type n -> Type n) -> Type n
- tForalls :: [Kind n] -> ([Type n] -> Type n) -> Type n
- tForalls' :: Int -> [Kind n] -> ([Type n] -> Type n) -> Type n
- takeTForalls :: Type n -> Maybe ([Bind n], Type n)
- eraseTForalls :: Ord n => Type n -> Type n
- tBot :: Kind n -> Type n
- tSum :: Ord n => Kind n -> [Type n] -> Type n
- tApp :: Type n -> Type n -> Type n
- ($:) :: Type n -> Type n -> Type n
- tApps :: Type n -> [Type n] -> Type n
- takeTApps :: Type n -> [Type n]
- takeTyConApps :: Type n -> Maybe (TyCon n, [Type n])
- takePrimTyConApps :: Type n -> Maybe (n, [Type n])
- takeDataTyConApps :: Type n -> Maybe (TyCon n, [Type n])
- takePrimeRegion :: Type n -> Maybe (Type n)
- tFun :: Type n -> Type n -> Type n
- tFunOfList :: [Type n] -> Maybe (Type n)
- tFunOfParamResult :: [Type n] -> Type n -> Type n
- takeTFun :: Type n -> Maybe (Type n, Type n)
- takeTFunArgResult :: Type n -> ([Type n], Type n)
- takeTFunWitArgResult :: Type n -> ([Type n], [Type n], Type n)
- takeTFunAllArgResult :: Type n -> ([Type n], Type n)
- arityOfType :: Type n -> Int
- dataArityOfType :: Type n -> Int
- tSusp :: Effect n -> Type n -> Type n
- takeTSusp :: Type n -> Maybe (Effect n, Type n)
- takeTSusps :: Type n -> ([Effect n], Type n)
- tImpl :: Type n -> Type n -> Type n
- tUnit :: Type n
- tIx :: Kind n -> Int -> Type n
- takeTExists :: Type n -> Maybe Int
- tRead :: Type n -> Type n
- tDeepRead :: Type n -> Type n
- tHeadRead :: Type n -> Type n
- tWrite :: Type n -> Type n
- tDeepWrite :: Type n -> Type n
- tAlloc :: Type n -> Type n
- tDeepAlloc :: Type n -> Type n
- tPure :: Type n -> Type n
- tConst :: Type n -> Type n
- tDeepConst :: Type n -> Type n
- tMutable :: Type n -> Type n
- tDeepMutable :: Type n -> Type n
- tDistinct :: Int -> [Type n] -> Type n
- tConData0 :: n -> Kind n -> Type n
- tConData1 :: n -> Kind n -> Type n -> Type n
Abstract Syntax
Types
A value type, kind, or sort.
We use the same data type to represent all three universes, as they have a similar algebraic structure.
A least upper bound of several types.
We keep type sums in this normalised format instead of joining them
together with a binary operator (like (+)
). This makes sums easier to work
with, as a given sum type often only has a single physical representation.
TypeSumBot | |
| |
TypeSumSet | |
|
Hash value used to insert types into the typeSumElems
array of a TypeSum
.
data TypeSumVarCon n Source #
Wraps a variable or constructor that can be added the typeSumElems
array.
TypeSumVar !(Bound n) | |
TypeSumCon !(Bound n) !(Kind n) |
Show n => Show (TypeSumVarCon n) Source # | |
Binding
A variable binder with its type.
A bound occurrence of a variable, with its type.
If variable hasn't been annotated with its real type then this
can be tBot
(an empty sum).
Constructors
Kind, type and witness constructors.
These are grouped to make it easy to determine the universe that they belong to.
TyConSort !SoCon | (level 3) Builtin Sort constructors. |
TyConKind !KiCon | (level 2) Builtin Kind constructors. |
TyConWitness !TwCon | (level 1) Builtin Spec constructors for the types of witnesses. |
TyConSpec !TcCon | (level 1) Builtin Spec constructors for types of other kinds. |
TyConBound !(Bound n) !(Kind n) | User defined type constructor. |
TyConExists !Int !(Kind n) | An existentially quantified name, with its kind. Used during type checking, but not accepted in source programs. |
Sort constructor.
Kind constructor.
KiConFun | Function kind constructor. This is only well formed when it is fully applied. |
KiConWitness | Kind of witnesses. |
KiConData | Kind of data values. |
KiConRegion | Kind of regions. |
KiConEffect | Kind of effects. |
KiConClosure | Kind of closures. |
Witness type constructors.
TwConImpl | |
TwConPure | Purity of some effect. |
TwConConst | Constancy of some region. |
TwConDeepConst | Constancy of material regions in some type |
TwConMutable | Mutability of some region. |
TwConDeepMutable | Mutability of material regions in some type. |
TwConDistinct Int | Distinctness of some n regions |
TwConDisjoint | Non-interfering effects are disjoint. Used for rewrite rules. |
Other constructors at the spec level.
TcConUnit | The unit data type constructor is baked in. |
TcConFun | Pure function. |
TcConSusp | A suspended computation. |
TcConRead | Read of some region. |
TcConHeadRead | Read the head region in a data type. |
TcConDeepRead | Read of all material regions in a data type. |
TcConWrite | Write of some region. |
TcConDeepWrite | Write to all material regions in some data type. |
TcConAlloc | Allocation into some region. |
TcConDeepAlloc | Allocation into all material regions in some data type. |
Aliases
Predicates
Binders
Atoms
Kinds
isDataKind :: Kind n -> Bool Source #
Check if some kind is the data kind.
isRegionKind :: Region n -> Bool Source #
Check if some kind is the region kind.
isEffectKind :: Kind n -> Bool Source #
Check if some kind is the effect kind.
isClosureKind :: Kind n -> Bool Source #
Check if some kind is the closure kind.
isWitnessKind :: Kind n -> Bool Source #
Check if some kind is the witness kind.
Data Types
isAlgDataType :: Eq n => Type n -> Bool Source #
Check whether this type is that of algebraic data.
It needs to have an explicit data constructor out the front,
and not a type variable. The constructor must not be the function
constructor, and must return a value of kind *
.
isMutableWitType :: Eq n => Type n -> Bool Source #
Check whether this is the type of a Mutable
witness.
isDistinctWitType :: Eq n => Type n -> Bool Source #
Check whether this is the type of a Distinct
witness.
Effect Types
isReadEffect :: Effect n -> Bool Source #
Check whether this is an atomic read effect.
isWriteEffect :: Effect n -> Bool Source #
Check whether this is an atomic write effect.
isAllocEffect :: Effect n -> Bool Source #
Check whether this is an atomic alloc effect.
isSomeReadEffect :: Effect n -> Bool Source #
Check whether an effect is some sort of read effect.
Matches Read
HeadRead
and DeepRead
.
isSomeWriteEffect :: Effect n -> Bool Source #
Check whether an effect is some sort of allocation effect.
Matches Alloc
and DeepAlloc
isSomeAllocEffect :: Effect n -> Bool Source #
Check whether an effect is some sort of allocation effect.
Matches Alloc
and DeepAlloc
Relations
Equivalence
equivT :: Ord n => EnvT n -> Type n -> Type n -> Bool Source #
Check equivalence of types.
Checks equivalence up to alpha-renaming, as well as crushing of effects and trimming of closures.
- Return
False
if we find any free variables. - We assume the types are well-kinded, so that the type annotations on bound variables match the binders. If this is not the case then you get an indeterminate result.
:: Ord n | |
=> EnvT n | Environment of types. |
-> [Bind n] | Stack of binders for first type. |
-> [Bind n] | Stack of binders for second type. |
-> Type n | First type to compare. |
-> Type n | Second type to compare. |
-> Bool |
Like equivT
but take the initial stacks of type binders.
equivTyCon :: Eq n => TyCon n -> TyCon n -> Bool Source #
Check if two TyCons
are equivalent.
We need to handle TyConBound
specially incase it's kind isn't attached,
Subsumption
subsumesT :: Ord n => EnvT n -> Kind n -> Type n -> Type n -> Bool Source #
Check whether the first type subsumes the second.
Both arguments are converted to sums, and we check that every element of the second sum is equivalent to an element in the first.
This only works for well formed types of effect and closure kind.
Other types will yield False
.
Transforms
Crushing
crushSomeT :: Ord n => EnvT n -> Type n -> Type n Source #
Crush compound effects and closure terms. We check for a crushable term before calling crushT because that function will recursively crush the components. As equivT is already recursive, we don't want a doubly-recursive function that tries to re-crush the same non-crushable type over and over.
crushEffect :: Ord n => EnvT n -> Effect n -> Effect n Source #
Crush compound effect terms into their components.
For example, crushing DeepRead (List r1 (Int r2))
yields (Read r1 + Read r2)
.
Compounds
Binds
takeNameOfBind :: Bind n -> Maybe n Source #
Take the variable name of a bind. If this is an anonymous binder then there won't be a name.
typeOfBind :: Bind n -> Type n Source #
Take the type of a bind.
Binders
binderOfBind :: Bind n -> Binder n Source #
Take the binder of a bind.
partitionBindsByType :: Eq n => [Bind n] -> [([Binder n], Type n)] Source #
Make lists of binds that have the same type.
Bounds
takeNameOfBound :: Bound n -> Maybe n Source #
Take the name of bound variable. If this is a deBruijn index then there won't be a name.
namedBoundMatchesBind :: Eq n => Bound n -> Bind n -> Bool Source #
Check whether a named bound matches a named bind.
Yields False
if they are not named or have different names.
Sorts
Kinds
takeKFuns :: Kind n -> ([Kind n], Kind n) Source #
Destruct a chain of kind functions into the arguments
takeKFuns' :: Kind n -> [Kind n] Source #
Like takeKFuns
, but return argument and return kinds in the same list.
takeResultKind :: Kind n -> Kind n Source #
Take the result kind of a kind function, or return the same kind unharmed if it's not a kind function.
Quantifiers
tForall :: Kind n -> (Type n -> Type n) -> Type n Source #
Build an anonymous type abstraction, with a single parameter.
tForall' :: Int -> Kind n -> (Type n -> Type n) -> Type n Source #
Build an anonymous type abstraction, with a single parameter. Starting the next index from the given value.
tForalls :: [Kind n] -> ([Type n] -> Type n) -> Type n Source #
Build an anonymous type abstraction, with several parameters. Starting the next index from the given value.
tForalls' :: Int -> [Kind n] -> ([Type n] -> Type n) -> Type n Source #
Build an anonymous type abstraction, with several parameters. Starting the next index from the given value.
takeTForalls :: Type n -> Maybe ([Bind n], Type n) Source #
Split nested foralls from the front of a type,
or Nothing
if there was no outer forall.
Sums
Applications
takeTApps :: Type n -> [Type n] Source #
Flatten a sequence ot type applications into the function part and arguments, if any.
takeTyConApps :: Type n -> Maybe (TyCon n, [Type n]) Source #
Flatten a sequence of type applications, returning the type constructor and arguments, if there is one.
takePrimTyConApps :: Type n -> Maybe (n, [Type n]) Source #
Flatten a sequence of type applications, returning the type constructor and arguments, if there is one. Only accept primitive type constructors.
takeDataTyConApps :: Type n -> Maybe (TyCon n, [Type n]) Source #
Flatten a sequence of type applications, returning the type constructor and arguments, if there is one. Only accept data type constructors.
takePrimeRegion :: Type n -> Maybe (Type n) Source #
Take the prime region variable of a data type. This corresponds to the region the outermost constructor is allocated into.
Functions
tFunOfList :: [Type n] -> Maybe (Type n) Source #
Construct a function type from a list containing the parameter
and return types. Yields Nothing
if the list is empty.
tFunOfParamResult :: [Type n] -> Type n -> Type n Source #
Construct a function type from a list of parameter types and the return type.
takeTFun :: Type n -> Maybe (Type n, Type n) Source #
Yield the argument and result type of a function type.
takeTFunArgResult :: Type n -> ([Type n], Type n) Source #
Destruct the type of a function, returning just the argument and result types.
takeTFunWitArgResult :: Type n -> ([Type n], [Type n], Type n) Source #
Destruct the type of a function,
returning the witness argument, value argument and result types.
The function type must have the witness implications before
the value arguments, eg T1 => T2 -> T3 -> T4 -> T5
.
takeTFunAllArgResult :: Type n -> ([Type n], Type n) Source #
Destruct the type of a possibly polymorphic function returning all kinds of quantifiers, witness arguments, and value arguments in the order they appear, along with the type of the result.
arityOfType :: Type n -> Int Source #
Determine the arity of an expression by looking at its type. Count all the function arrows, and foralls.
This assumes the type is in prenex form, meaning that all the quantifiers are at the front.
dataArityOfType :: Type n -> Int Source #
The data arity of a type is the number of data values it takes.
Unlike arityOfType
we ignore type and witness parameters.
Suspensions
takeTSusp :: Type n -> Maybe (Effect n, Type n) Source #
Take the effect and result type of a suspension type.
Implications
Units
Variables
Effect types
tDeepWrite :: Type n -> Type n Source #
Deep Write effect type constructor.
tDeepAlloc :: Type n -> Type n Source #
Deep Alloc effect type constructor.
Witness types
tDeepConst :: Type n -> Type n Source #
Deep Const witness type constructor.
tDeepMutable :: Type n -> Type n Source #
Deep Mutable witness type constructor.