Safe Haskell | None |
---|---|

Language | Haskell2010 |

Functions relating to skolemization used during typechecking

## Synopsis

- newSkolemConstant :: MonadState CheckState m => m Int
- introduceSkolemScope :: MonadState CheckState m => Type a -> m (Type a)
- newSkolemScope :: MonadState CheckState m => m SkolemScope
- skolemize :: a -> Text -> Int -> SkolemScope -> Type a -> Type a
- skolemizeTypesInValue :: SourceAnn -> Text -> Int -> SkolemScope -> Expr -> Expr
- skolemEscapeCheck :: MonadError MultipleErrors m => Expr -> m ()

# Documentation

newSkolemConstant :: MonadState CheckState m => m Int Source #

Generate a new skolem constant

introduceSkolemScope :: MonadState CheckState m => Type a -> m (Type a) Source #

Introduce skolem scope at every occurence of a ForAll

newSkolemScope :: MonadState CheckState m => m SkolemScope Source #

Generate a new skolem scope

skolemize :: a -> Text -> Int -> SkolemScope -> Type a -> Type a Source #

Skolemize a type variable by replacing its instances with fresh skolem constants

skolemizeTypesInValue :: SourceAnn -> Text -> Int -> SkolemScope -> Expr -> Expr Source #

This function skolemizes type variables appearing in any type signatures or
`DeferredDictionary`

placeholders. These type variables are the only places
where scoped type variables can appear in expressions.

skolemEscapeCheck :: MonadError MultipleErrors m => Expr -> m () Source #

Ensure skolem variables do not escape their scope

Every skolem variable is created when a `ForAll`

type is skolemized.
This determines the scope of that skolem variable, which is copied from
the `SkolemScope`

field of the `ForAll`

constructor.

This function traverses the tree top-down, and collects any `SkolemScope`

s
introduced by `ForAll`

s. If a `Skolem`

is encountered whose `SkolemScope`

is
not in the current list, then we have found an escaped skolem variable.