Safe Haskell | None |
---|---|
Language | Haskell2010 |
- data GenInfo = GenInfo {}
- newtype Source = Source (GenInfo, SourcePos)
- emptySource :: Source
- data Exp a
- = EVar a EVarName
- | EApp a (Exp a) [Exp a]
- | EAbs a [EVarName] (Exp a)
- | ELet a EVarName (Exp a) (Exp a)
- | ELit a LitVal
- | EAssign a EVarName (Exp a) (Exp a)
- | EPropAssign a (Exp a) EPropName (Exp a) (Exp a)
- | EIndexAssign a (Exp a) (Exp a) (Exp a) (Exp a)
- | EArray a [Exp a]
- | ETuple a [Exp a]
- | ERow a Bool [(EPropName, Exp a)]
- | EStringMap a [(String, Exp a)]
- | ECase a (Exp a) [(LitVal, Exp a)]
- | EProp a (Exp a) EPropName
- | EIndex a (Exp a) (Exp a)
- | ENew a (Exp a) [Exp a]
- data LitVal
- type EVarName = String
- type TVarName = Int
- data TBody
- data TConsName
- = TArray
- | TTuple
- | TName TypeId
- | TStringMap
- newtype TypeId = TypeId TVarName
- type Type = Fix FType
- newtype Fix f = Fix {}
- replaceFix :: (Functor f, Eq (f (Fix f))) => f (Fix f) -> f (Fix f) -> Fix f -> Fix f
- data FType t
- data TypeError = TypeError {}
- data InferState = InferState {
- nameSource :: NameSource
- mainSubst :: TSubst
- varSchemes :: Map VarId TypeScheme
- varInstances :: Gr QualType ()
- namedTypes :: Map TypeId (Type, TypeScheme)
- classes :: Map ClassName (Class Type)
- pendingUni :: Set (Source, Type, (ClassName, Set TypeScheme))
- newtype RowTVar = RowTVar TVarName
- getRowTVar :: RowTVar -> TVarName
- liftRowTVar :: (TVarName -> TVarName) -> RowTVar -> RowTVar
- data FlatRowEnd t
- = FlatRowEndTVar (Maybe RowTVar)
- | FlatRowEndRec TypeId [t]
- data TRowList t
- newtype ClassName = ClassName String
- data Class t = Class {
- classInstances :: [TScheme t]
- data TPred t = TPredIsIn {}
- data TQual t = TQual {}
- qualEmpty :: t -> TQual t
- type QualType = TQual Type
- data TScheme t = TScheme {
- schemeVars :: [TVarName]
- schemeType :: TQual t
- schemeEmpty :: t -> TScheme t
- schemeFromQual :: TQual t -> TScheme t
- type TypeScheme = TScheme Type
- type TypeEnv = Map EVarName VarId
- class Substable a where
- applySubst :: TSubst -> a -> a
- applySubst' :: (Functor f, Substable a) => TSubst -> f a -> f a
- flattenRow :: TRowList t -> (Map EPropName (TScheme t), FlatRowEnd t)
- unflattenRow :: Map EPropName (TScheme t) -> FlatRowEnd t -> (EPropName -> Bool) -> TRowList t
- type TSubst = Map TVarName Type
- nullSubst :: TSubst
- composeSubst :: TSubst -> TSubst -> TSubst
- singletonSubst :: TVarName -> Type -> TSubst
- newtype VarId = VarId Int
- data NameSource = NameSource {}
- addEquivalence :: TVarName -> TVarName -> Gr QualType () -> Gr QualType ()
- class VarNames a where
- freeTypeVars :: a -> Set TVarName
- mapVarNames :: (TVarName -> TVarName) -> a -> a
- type EPropName = String
- mapTopAnnotation :: (a -> a) -> Exp a -> Exp a
Documentation
EVar a EVarName | |
EApp a (Exp a) [Exp a] | |
EAbs a [EVarName] (Exp a) | |
ELet a EVarName (Exp a) (Exp a) | |
ELit a LitVal | |
EAssign a EVarName (Exp a) (Exp a) | |
EPropAssign a (Exp a) EPropName (Exp a) (Exp a) | |
EIndexAssign a (Exp a) (Exp a) (Exp a) (Exp a) | |
EArray a [Exp a] | |
ETuple a [Exp a] | |
ERow a Bool [(EPropName, Exp a)] | |
EStringMap a [(String, Exp a)] | |
ECase a (Exp a) [(LitVal, Exp a)] | |
EProp a (Exp a) EPropName | |
EIndex a (Exp a) (Exp a) | |
ENew a (Exp a) [Exp a] |
Substable Type | applySubst for Types >>> applySubst (Map.fromList [(0, Fix $ TBody TNumber)]) (Fix $ TBody $ TVar 0) Fix (TBody TNumber) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TBody $ TVar 0) Fix (TRow (TRowEnd Nothing)) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TRow $ TRowEnd $ Just $ RowTVar 0) Fix (TRow (TRowEnd Nothing)) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TRow $ TRowProp "bla" (schemeEmpty $ Fix $ TBody TString) (TRowEnd $ Just $ RowTVar 0)) Fix (TRow (TRowProp "bla" (TScheme {schemeVars = [], schemeType = TQual {qualPred = [], qualType = Fix (TBody TString)}}) (TRowEnd Nothing))) |
VarNames Type | VarNames instance for Type t
|
Pretty Type | |
Eq (f (Fix f)) => Eq (Fix f) | |
Ord (f (Fix f)) => Ord (Fix f) | |
Show (f (Fix f)) => Show (Fix f) | |
Substable (TRowList Type) | |
VarNames (FType (Fix FType)) | |
Pretty [Type] | |
Pretty (FType Type) |
TBody TBody | |
TCons TConsName [t] | |
TFunc [t] t | TFunc (functions) are Profunctor-types. Arguments could have been a single |
TRow (TRowList t) |
Functor FType | |
Foldable FType | |
Traversable FType | |
Substable Type | applySubst for Types >>> applySubst (Map.fromList [(0, Fix $ TBody TNumber)]) (Fix $ TBody $ TVar 0) Fix (TBody TNumber) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TBody $ TVar 0) Fix (TRow (TRowEnd Nothing)) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TRow $ TRowEnd $ Just $ RowTVar 0) Fix (TRow (TRowEnd Nothing)) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TRow $ TRowProp "bla" (schemeEmpty $ Fix $ TBody TString) (TRowEnd $ Just $ RowTVar 0)) Fix (TRow (TRowProp "bla" (TScheme {schemeVars = [], schemeType = TQual {qualPred = [], qualType = Fix (TBody TString)}}) (TRowEnd Nothing))) |
VarNames Type | VarNames instance for Type t
|
Pretty Type | |
Eq t => Eq (FType t) | |
Ord t => Ord (FType t) | |
Show t => Show (FType t) | |
Substable (TRowList Type) | |
VarNames (FType (Fix FType)) | |
Pretty [Type] | |
Pretty (FType Type) |
data InferState Source
InferState | |
|
Eq InferState | |
Show InferState | |
Substable InferState | |
VarNames InferState | VarNames instance for InferState >>> :{ varInstances $ mapVarNames (k -> k + 1) $ emptyInferState { varInstances = Map.fromList [ (0, Set.fromList [ qualEmpty $ Fix $ TBody $ TVar 0, qualEmpty $ Fix $ TBody $ TVar 1]) , (1, Set.fromList [ qualEmpty $ Fix $ TBody $ TVar 0 , TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 3)] (Fix $ TBody $ TVar 1) ]) ]} :} fromList [(1,fromList [TQual {qualPred = [], qualType = Fix (TBody (TVar 1))},TQual {qualPred = [], qualType = Fix (TBody (TVar 2))}]),(2,fromList [TQual {qualPred = [], qualType = Fix (TBody (TVar 1))},TQual {qualPred = [TPredIsIn {predClass = ClassName Bla, predType = Fix (TBody (TVar 4))}], qualType = Fix (TBody (TVar 2))}])] |
Pretty InferState |
getRowTVar :: RowTVar -> TVarName Source
data FlatRowEnd t Source
Row type.
Functor TRowList | |
Foldable TRowList | |
Traversable TRowList | |
Eq t => Eq (TRowList t) | |
Ord t => Ord (TRowList t) | |
Show t => Show (TRowList t) | |
Substable (TRowList Type) | |
VarNames t => VarNames (TRowList t) | VarNames instance for TRowList
|
Class | |
|
Functor TQual | |
Foldable TQual | |
Traversable TQual | |
Eq t => Eq (TQual t) | |
Ord t => Ord (TQual t) | |
Show t => Show (TQual t) | |
(Substable t, VarNames t) => Substable (TQual t) | Substable instance for TQual >>> let qt = TQual [TPredIsIn (ClassName Bla) (Fix $ TBody (TVar 0))] (Fix $ TBody (TVar 0)) >>> let s = singletonSubst 0 (Fix $ TBody TNumber) >>> applySubst s qt TQual {qualPred = [TPredIsIn {predClass = ClassName Bla, predType = Fix (TBody TNumber)}], qualType = Fix (TBody TNumber)} |
VarNames t => VarNames (TQual t) | |
(VarNames t, Pretty t) => Pretty (TQual t) |
TScheme | |
|
Functor TScheme | |
Foldable TScheme | |
Traversable TScheme | |
Eq t => Eq (TScheme t) | |
Ord t => Ord (TScheme t) | |
Show t => Show (TScheme t) | |
(VarNames t, Substable t) => Substable (TScheme t) | |
VarNames t => VarNames (TScheme t) | VarNames instance for TScheme >>> let sc v t = TScheme v (qualEmpty t) >>> freeTypeVars $ sc [0, 1] (Fix $ TBody $ TVar 2) fromList [2] >>> freeTypeVars $ sc [0, 1] (Fix $ TBody $ TVar 1) fromList [] >>> freeTypeVars $ sc [0] (Fix $ TBody $ TVar 1) fromList [1] >>> freeTypeVars $ sc [0] (Fix $ TBody $ TVar 0) fromList [] >>> freeTypeVars $ schemeEmpty (Fix $ TBody $ TVar 1) fromList [1] >>> freeTypeVars $ schemeEmpty (Fix $ TBody $ TNumber) fromList [] >>> freeTypeVars $ sc [1] (Fix $ TBody $ TNumber) fromList [] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 0)] (Fix $ TBody $ TVar 0)) fromList [] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 0)] (Fix $ TBody $ TVar 2)) fromList [2] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 2)] (Fix $ TBody $ TVar 2)) fromList [2] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 2)] (Fix $ TBody $ TVar 0)) fromList [2] |
(Ord t, VarNames t, Pretty t) => Pretty (TScheme t) |
schemeEmpty :: t -> TScheme t Source
schemeFromQual :: TQual t -> TScheme t Source
type TypeScheme = TScheme Type Source
type TypeEnv = Map EVarName VarId Source
Type environment: maps AST variables (not type variables!) to quantified type schemes.
Note: instance of Substable
class Substable a where Source
applySubst :: TSubst -> a -> a Source
applySubst' :: (Functor f, Substable a) => TSubst -> f a -> f a Source
Substable InferState | |
Substable Type | applySubst for Types >>> applySubst (Map.fromList [(0, Fix $ TBody TNumber)]) (Fix $ TBody $ TVar 0) Fix (TBody TNumber) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TBody $ TVar 0) Fix (TRow (TRowEnd Nothing)) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TRow $ TRowEnd $ Just $ RowTVar 0) Fix (TRow (TRowEnd Nothing)) >>> applySubst (Map.fromList [(0, Fix $ TRow $ TRowEnd Nothing)]) (Fix $ TRow $ TRowProp "bla" (schemeEmpty $ Fix $ TBody TString) (TRowEnd $ Just $ RowTVar 0)) Fix (TRow (TRowProp "bla" (TScheme {schemeVars = [], schemeType = TQual {qualPred = [], qualType = Fix (TBody TString)}}) (TRowEnd Nothing))) |
Substable a => Substable [a] | |
Substable a => Substable (Maybe a) | |
(Ord a, Substable a) => Substable (Set a) | |
(VarNames t, Substable t) => Substable (TScheme t) | |
(Substable t, VarNames t) => Substable (TQual t) | Substable instance for TQual >>> let qt = TQual [TPredIsIn (ClassName Bla) (Fix $ TBody (TVar 0))] (Fix $ TBody (TVar 0)) >>> let s = singletonSubst 0 (Fix $ TBody TNumber) >>> applySubst s qt TQual {qualPred = [TPredIsIn {predClass = ClassName Bla, predType = Fix (TBody TNumber)}], qualType = Fix (TBody TNumber)} |
Substable t => Substable (TPred t) | |
Substable (TRowList Type) | |
Substable b => Substable (a, b) | |
Substable a => Substable (Map b a) |
flattenRow :: TRowList t -> (Map EPropName (TScheme t), FlatRowEnd t) Source
unflattenRow :: Map EPropName (TScheme t) -> FlatRowEnd t -> (EPropName -> Bool) -> TRowList t Source
composeSubst :: TSubst -> TSubst -> TSubst Source
composeSubst should obey the law: applySubst (composeSubst new old) t = applySubst new (applySubst old t) >>> composeSubst (Map.fromList []) (Map.fromList []) fromList [] >>> composeSubst (Map.fromList [(0,Fix (TBody (TVar 1)))]) (Map.fromList []) fromList [(0,Fix (TBody (TVar 1)))] >>> composeSubst (Map.fromList []) (Map.fromList [(0,Fix (TBody (TVar 1)))]) fromList [(0,Fix (TBody (TVar 1)))] >>> composeSubst (Map.fromList [(1,Fix (TBody (TVar 2)))]) (Map.fromList [(0,Fix (TBody (TVar 1)))]) fromList [(0,Fix (TBody (TVar 2))),(1,Fix (TBody (TVar 2)))] >>> composeSubst (Map.fromList [(0,Fix (TBody (TVar 1)))]) (Map.fromList [(1,Fix (TBody (TVar 2)))]) fromList [(0,Fix (TBody (TVar 2))),(1,Fix (TBody (TVar 2)))]
singletonSubst :: TVarName -> Type -> TSubst Source
data NameSource Source
addEquivalence :: TVarName -> TVarName -> Gr QualType () -> Gr QualType () Source
Adds a pair of equivalent items to an equivalence map. >>> import Infernu.Pretty >>> let m1 = addEquivalence 1 2 Map.empty >>> pretty m1 "Map (b => Set {b, c}, c => Set {b, c})" >>> pretty $ addEquivalence 1 3 m1 "Map (b => Set {b, c, d}, c => Set {b, c, d}, d => Set {b, c, d})" >>> pretty $ addEquivalence 3 1 m1 "Map (b => Set {b, c, d}, c => Set {b, c, d}, d => Set {b, c, d})" >>> pretty $ addEquivalence 4 5 m1 "Map (b => Set {b, c}, c => Set {b, c}, e => Set {e, f}, f => Set {e, f})" >>> pretty $ addEquivalence 1 4 $ addEquivalence 4 5 m1 "Map (b => Set {b, c, e, f}, c => Set {b, c, e, f}, e => Set {b, c, e, f}, f => Set {b, c, e, f})"
freeTypeVars :: a -> Set TVarName Source
mapVarNames :: (TVarName -> TVarName) -> a -> a Source
VarNames InferState | VarNames instance for InferState >>> :{ varInstances $ mapVarNames (k -> k + 1) $ emptyInferState { varInstances = Map.fromList [ (0, Set.fromList [ qualEmpty $ Fix $ TBody $ TVar 0, qualEmpty $ Fix $ TBody $ TVar 1]) , (1, Set.fromList [ qualEmpty $ Fix $ TBody $ TVar 0 , TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 3)] (Fix $ TBody $ TVar 1) ]) ]} :} fromList [(1,fromList [TQual {qualPred = [], qualType = Fix (TBody (TVar 1))},TQual {qualPred = [], qualType = Fix (TBody (TVar 2))}]),(2,fromList [TQual {qualPred = [], qualType = Fix (TBody (TVar 1))},TQual {qualPred = [TPredIsIn {predClass = ClassName Bla, predType = Fix (TBody (TVar 4))}], qualType = Fix (TBody (TVar 2))}])] |
VarNames Type | VarNames instance for Type t
|
VarNames TBody | |
VarNames TVarName | |
VarNames t => VarNames [t] | |
VarNames t => VarNames (TScheme t) | VarNames instance for TScheme >>> let sc v t = TScheme v (qualEmpty t) >>> freeTypeVars $ sc [0, 1] (Fix $ TBody $ TVar 2) fromList [2] >>> freeTypeVars $ sc [0, 1] (Fix $ TBody $ TVar 1) fromList [] >>> freeTypeVars $ sc [0] (Fix $ TBody $ TVar 1) fromList [1] >>> freeTypeVars $ sc [0] (Fix $ TBody $ TVar 0) fromList [] >>> freeTypeVars $ schemeEmpty (Fix $ TBody $ TVar 1) fromList [1] >>> freeTypeVars $ schemeEmpty (Fix $ TBody $ TNumber) fromList [] >>> freeTypeVars $ sc [1] (Fix $ TBody $ TNumber) fromList [] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 0)] (Fix $ TBody $ TVar 0)) fromList [] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 0)] (Fix $ TBody $ TVar 2)) fromList [2] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 2)] (Fix $ TBody $ TVar 2)) fromList [2] >>> freeTypeVars $ TScheme [0, 1] (TQual [TPredIsIn (ClassName Bla) (Fix $ TBody $ TVar 2)] (Fix $ TBody $ TVar 0)) fromList [2] |
VarNames t => VarNames (TQual t) | |
VarNames t => VarNames (TPred t) | |
VarNames (FType (Fix FType)) | |
VarNames t => VarNames (TRowList t) | VarNames instance for TRowList
|
VarNames t => VarNames (Exp (a, t)) | |
VarNames t => VarNames (a, t) | |
VarNames t => VarNames (Map a t) |
mapTopAnnotation :: (a -> a) -> Exp a -> Exp a Source