curry-frontend-2.0.0: src/Base/KindSubst.hs
{- |
Module : $Header$
Description : Kind substitution
Copyright : (c) 2016 Finn Teegen
License : BSD-3-clause
Maintainer : bjp@informatik.uni-kiel.de
Stability : experimental
Portability : portable
This module implements substitutions on kinds.
-}
module Base.KindSubst
( module Base.KindSubst, idSubst, singleSubst, bindSubst, compose
) where
import Base.Kinds
import Base.Subst
import Base.TopEnv
import Env.TypeConstructor
type KindSubst = Subst Int Kind
class SubstKind a where
subst :: KindSubst -> a -> a
bindVar :: Int -> Kind -> KindSubst -> KindSubst
bindVar kv k = compose (bindSubst kv k idSubst)
substVar :: KindSubst -> Int -> Kind
substVar = substVar' KindVariable subst
instance SubstKind Kind where
subst _ KindStar = KindStar
subst sigma (KindVariable kv) = substVar sigma kv
subst sigma (KindArrow k1 k2) = KindArrow (subst sigma k1) (subst sigma k2)
instance SubstKind TypeInfo where
subst theta (DataType tc k cs) = DataType tc (subst theta k) cs
subst theta (RenamingType tc k nc) = RenamingType tc (subst theta k) nc
subst theta (AliasType tc k n ty) = AliasType tc (subst theta k) n ty
subst theta (TypeClass cls k ms) = TypeClass cls (subst theta k) ms
subst theta (TypeVar k) = TypeVar (subst theta k)
instance SubstKind a => SubstKind (TopEnv a) where
subst = fmap . subst