Copyright | (c) Kimiyuki Onaka 2021 |
---|---|
License | Apache License 2.0 |
Maintainer | kimiyuki95@gmail.com |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
Synopsis
- run :: (MonadAlpha m, MonadError Error m) => Program -> m Program
- runExpr :: (MonadAlpha m, MonadError Error m) => [(VarName, Type)] -> Expr -> m Expr
- runRule :: (MonadAlpha m, MonadError Error m) => [(VarName, Type)] -> Expr -> Expr -> m ([(VarName, Type)], Expr, Expr)
- data Equation
- = TypeEquation Type Type [Hint]
- | TypeAssertion VarName Type
- formularizeProgram :: (MonadAlpha m, MonadError Error m) => Program -> m [Equation]
- sortEquations :: [Equation] -> ([(Type, Type, [Hint])], [(VarName, Type)])
- mergeAssertions :: [(VarName, Type)] -> [(Type, Type, [Hint])]
- newtype Subst = Subst {}
- subst :: Subst -> Type -> Type
- substDefault :: Type -> Type -> Type
- solveEquations :: MonadError Error m => [(Type, Type, [Hint])] -> m Subst
- substProgram :: MonadError Error m => Maybe Type -> Subst -> Program -> m Program
Documentation
run :: (MonadAlpha m, MonadError Error m) => Program -> m Program Source #
run
does type inference.
- This assumes that program has no name conflicts.
Before:
let f = fun y -> y in let x = 1 in f(x + x)
After:
let f: int -> int = fun y: int -> y in let x: int = 1 in f(x + x)
runExpr :: (MonadAlpha m, MonadError Error m) => [(VarName, Type)] -> Expr -> m Expr Source #
runRule :: (MonadAlpha m, MonadError Error m) => [(VarName, Type)] -> Expr -> Expr -> m ([(VarName, Type)], Expr, Expr) Source #
internal types and functions
TypeEquation Type Type [Hint] | |
TypeAssertion VarName Type |
formularizeProgram :: (MonadAlpha m, MonadError Error m) => Program -> m [Equation] Source #
Subst
is type substituion. It's a mapping from type variables to their actual types.
substDefault :: Type -> Type -> Type Source #
substDefault
replaces all undetermined type variables with the given default type.
solveEquations :: MonadError Error m => [(Type, Type, [Hint])] -> m Subst Source #
substProgram :: MonadError Error m => Maybe Type -> Subst -> Program -> m Program Source #