| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Unison.Typechecker.Context
Synopsis
- synthesizeClosed :: (BuiltinAnnotation loc, Var v, Ord loc, Show loc, Semigroup loc) => PrettyPrintEnv -> PatternMatchCoverageCheckAndKindInferenceSwitch -> Map Reference [Variance] -> [Type v loc] -> TypeLookup v loc -> Term v loc -> Result v loc (Type v loc)
- data ErrorNote v loc = ErrorNote {
- cause :: Cause v loc
- path :: Seq (PathElement v loc)
- data CompilerBug v loc
- = UnknownDecl Unknown Reference (Map Reference (DataDeclaration v loc))
- | UnknownConstructor Unknown ConstructorReference (DataDeclaration v loc)
- | UndeclaredTermVariable v (Context v loc)
- | RetractFailure (Element v loc) (Context v loc)
- | EmptyLetRec (Term v loc)
- | PatternMatchFailure
- | EffectConstructorHadMultipleEffects (Type v loc)
- | FreeVarsInTypeAnnotation (Set (TypeVar v loc))
- | UnannotatedReference Reference
- | MalformedPattern (Pattern loc)
- | UnknownTermReference Reference
- | UnknownExistentialVariable v (Context v loc)
- | IllegalContextExtension (Context v loc) (Element v loc) String
- | OtherBug String
- data InfoNote v loc
- = SolvedBlank (Recorded loc) v (Type v loc)
- | Decision v loc (Term v loc)
- | TopLevelComponent [(v, Type v loc, RedundantTypeAnnotation)]
- | Warning (Warn v loc)
- | VarBinding v loc (Type v loc)
- | VarMention v loc
- data Cause v loc
- = TypeMismatch (Context v loc)
- | IllFormedType (Context v loc)
- | UnknownSymbol loc v
- | UnknownTerm loc v [Suggestion v loc] (Type v loc)
- | AbilityCheckFailure [Type v loc] [Type v loc] (Context v loc)
- | AbilityEqFailure [Type v loc] [Type v loc] (Context v loc)
- | EffectConstructorWrongArgCount ExpectedArgCount ActualArgCount ConstructorReference
- | MalformedEffectBind (Type v loc) (Type v loc) [Type v loc]
- | PatternArityMismatch loc (Type v loc) Int
- | DuplicateDefinitions (NonEmpty (v, NESet loc))
- | UnguardedLetRecCycle [v] [(v, Term v loc)]
- | ConcatPatternWithoutConstantLength loc (Type v loc)
- | HandlerOfUnexpectedType loc (Type v loc)
- | DataEffectMismatch Unknown Reference (DataDeclaration v loc)
- | UncoveredPatterns loc (NonEmpty (Pattern ()))
- | RedundantPattern loc
- | KindInferenceFailure (KindError v loc)
- | InaccessiblePattern loc
- | RunWatchTypeMismatch loc (Type v loc)
- | MissingRecordField Text (Type v loc) (Type v loc) (Type v loc)
- | UnexpectedRecordField Text (Type v loc) (Type v loc) (Type v loc)
- | PatternMatchedMissingField Text (Pattern loc) (Type v loc)
- | RecordPatternMatchOnNonRecordType (Pattern loc) (Type v loc)
- data Context v loc
- elements :: Context v loc -> [Element v loc]
- data Warn v loc = AbilityConcreteSubset [Type v loc] [Type v loc] (Term v loc) (Context v loc)
- type ActualArgCount = Int
- type ExpectedArgCount = Int
- type ConstructorId = Word64
- data Element v loc
- data PathElement v loc
- = InSynthesize (Term v loc)
- | InSubtype (Type v loc) (Type v loc)
- | InSubAbilities [Type v loc] [Type v loc]
- | InEquate (Type v loc) (Type v loc)
- | InCheck (Term v loc) (Type v loc)
- | InInstantiateL v (Type v loc)
- | InInstantiateR (Type v loc) v
- | InSynthesizeApp (Type v loc) (Term v loc) Int
- | InFunctionCall [v] (Term v loc) (Type v loc) [Term v loc]
- | InAndApp
- | InOrApp
- | InIfCond
- | InIfBody loc
- | InVectorApp loc
- | InMatch loc
- | InMatchGuard
- | InMatchBody
- | InActionRestriction
- | InRecordLiteral loc
- | InRecordField loc Text
- type Term v loc = Term' (TypeVar v loc) v loc
- type Type v loc = Type (TypeVar v loc) loc
- type TypeVar v loc = TypeVar (Blank loc) v
- data Result v loc a
- data PatternMatchCoverageCheckAndKindInferenceSwitch
- errorTerms :: ErrorNote v loc -> [Term v loc]
- innermostErrorTerm :: ErrorNote v loc -> Maybe (Term v loc)
- lookupAnn :: Ord v => Context v loc -> v -> Maybe (Type v loc)
- lookupSolved :: Ord v => Context v loc -> v -> Maybe (Monotype v loc)
- apply :: Var v => Context v loc -> Type v loc -> Type v loc
- isEqual :: (Var v, Ord loc) => Type v loc -> Type v loc -> Either (CompilerBug v loc) Bool
- isSubtype :: (Var v, Ord loc) => Type v loc -> Type v loc -> Either (CompilerBug v loc) Bool
- fitsScheme :: (Var v, Ord loc) => Type v loc -> Type v loc -> Either (CompilerBug v loc) Bool
- isRedundant :: (Var v, Ord loc) => Type v loc -> Type v loc -> M v loc Bool
- data Suggestion v loc = Suggestion {}
- data Replacement v
- data SuggestionMatch
- isExact :: Suggestion v loc -> Bool
- typeErrors :: Result v loc a -> Seq (ErrorNote v loc)
- infoNotes :: Result v loc a -> Seq (InfoNote v loc)
- data Unknown
- relax :: (Var v, Ord loc) => Map Reference [Variance] -> Type v loc -> Type v loc
- generalizeAndUnTypeVar :: Var v => Type v a -> Type v a
Documentation
synthesizeClosed :: (BuiltinAnnotation loc, Var v, Ord loc, Show loc, Semigroup loc) => PrettyPrintEnv -> PatternMatchCoverageCheckAndKindInferenceSwitch -> Map Reference [Variance] -> [Type v loc] -> TypeLookup v loc -> Term v loc -> Result v loc (Type v loc) Source #
public interface to the typechecker
data CompilerBug v loc Source #
Constructors
| UnknownDecl Unknown Reference (Map Reference (DataDeclaration v loc)) | |
| UnknownConstructor Unknown ConstructorReference (DataDeclaration v loc) | |
| UndeclaredTermVariable v (Context v loc) | |
| RetractFailure (Element v loc) (Context v loc) | |
| EmptyLetRec (Term v loc) | |
| PatternMatchFailure | |
| EffectConstructorHadMultipleEffects (Type v loc) | |
| FreeVarsInTypeAnnotation (Set (TypeVar v loc)) | |
| UnannotatedReference Reference | |
| MalformedPattern (Pattern loc) | |
| UnknownTermReference Reference | |
| UnknownExistentialVariable v (Context v loc) | |
| IllegalContextExtension (Context v loc) (Element v loc) String | |
| OtherBug String |
Instances
| (Var v, Show loc, Ord loc) => Show (CompilerBug v loc) Source # | |
Defined in Unison.Typechecker.Context Methods showsPrec :: Int -> CompilerBug v loc -> ShowS # show :: CompilerBug v loc -> String # showList :: [CompilerBug v loc] -> ShowS # | |
Constructors
| SolvedBlank (Recorded loc) v (Type v loc) | |
| Decision v loc (Term v loc) | |
| TopLevelComponent [(v, Type v loc, RedundantTypeAnnotation)] | |
| Warning (Warn v loc) | |
| VarBinding v loc (Type v loc) | |
| VarMention v loc | The usage of a particular variable. We report the variable and its location so we can match a given source location with a specific symbol later in the LSP. |
Constructors
The ordered context of the typechecking algorithm.
The context is a sequence of Elements. The typechecking algorithm appends
to it, retracts a suffix of it (everything after a marker), replaces one
element with a few (e.g. an existential solved to an arrow, with the arrow's
fresh existentials inserted before it), and asks scoping questions: is this
variable declared, as an existential or a universal, and at what position?
Is it solved, and to what?
The sequence only orders the elements. What is known about each variable
is kept in indexes keyed by variable name, beside the sequence, and each of
those maps a variable to a position in the sequence (CtxPosition): every
element in the sequence has one, and vars maps each variable to
its element together with that position.
So for instance, a solution proposed for an existential β may only
mention variables declared before β in the context, existentials and
universals alike (the universals are the rigid type variables of enclosing
quantifiers). solve therefore looks up each free variable of the solution
in vars, checks that it is declared as the kind of variable it occurs
as, and compares its position with β's. Once β is solved, its solution
is read from the same entry. anns and refinements are the same idea for
term variable annotations and for the branch-local refinements of a
universal.
The sequence is a finger tree whose measure includes the greatest position in a
subtree (so that the element at a position can be found in logarithmic time),
and a count of Inconsistent elements (so that inconsistent can tell in
constant time whether the pattern-match branch being checked has been
marked unreachable by contradictory GADT refinements, in which case its
body is skipped).
Every change keeps the indexes describing exactly the elements in the sequence: an append or replacement records the new elements, and a retraction walks the elements it discards and forgets them. Each element is appended once and discarded at most once, so a retraction costs no more than the appends it undoes.
Segments of a context that have been retracted are plain lists
(CtxSegment); the typechecker reads them whole (to generalize over their
unsolved existentials, apply their solutions, or push some of them back).
Constructors
| AbilityConcreteSubset [Type v loc] [Type v loc] (Term v loc) (Context v loc) |
type ActualArgCount = Int Source #
type ExpectedArgCount = Int Source #
type ConstructorId = Word64 #
Elements of an ordered algorithmic context. Every element but Refined
declares its variable; a context is valid when no variable is declared twice and
every type in it mentions only variables declared before it.
Constructors
| Var (TypeVar v loc) | A variable declaration |
| Solved (Blank loc) v (Monotype v loc) |
|
| Ann v loc (Type v loc) |
|
| Refined v (Type v loc) | The (already-declared) universal variable |
| Inconsistent v | Marks the context as inconsistent (the DK indexed-types paper's |
| Marker v | used for scoping |
data PathElement v loc Source #
Constructors
| InSynthesize (Term v loc) | |
| InSubtype (Type v loc) (Type v loc) | |
| InSubAbilities [Type v loc] [Type v loc] | |
| InEquate (Type v loc) (Type v loc) | |
| InCheck (Term v loc) (Type v loc) | |
| InInstantiateL v (Type v loc) | |
| InInstantiateR (Type v loc) v | |
| InSynthesizeApp (Type v loc) (Term v loc) Int | |
| InFunctionCall [v] (Term v loc) (Type v loc) [Term v loc] | |
| InAndApp | |
| InOrApp | |
| InIfCond | |
| InIfBody loc | |
| InVectorApp loc | |
| InMatch loc | |
| InMatchGuard | |
| InMatchBody | |
| InActionRestriction | |
| InRecordLiteral loc | |
| InRecordField loc Text |
Instances
| (Show v, Show loc) => Show (PathElement v loc) Source # | |
Defined in Unison.Typechecker.Context Methods showsPrec :: Int -> PathElement v loc -> ShowS # show :: PathElement v loc -> String # showList :: [PathElement v loc] -> ShowS # | |
Constructors
| Success !(Seq (InfoNote v loc)) !a | |
| TypeError !(NESeq (ErrorNote v loc)) !(Seq (InfoNote v loc)) | |
| CompilerBug !(CompilerBug v loc) !(Seq (ErrorNote v loc)) !(Seq (InfoNote v loc)) |
Instances
| Applicative (Result v loc) Source # | |
Defined in Unison.Typechecker.Context | |
| Functor (Result v loc) Source # | |
| Monad (Result v loc) Source # | |
| MonadFix (Result v loc) Source # | |
Defined in Unison.Typechecker.Context | |
errorTerms :: ErrorNote v loc -> [Term v loc] Source #
apply :: Var v => Context v loc -> Type v loc -> Type v loc Source #
Replace any existentials with their solution in the context, and any refined universals with their refinement.
isSubtype :: (Var v, Ord loc) => Type v loc -> Type v loc -> Either (CompilerBug v loc) Bool Source #
fitsScheme :: (Var v, Ord loc) => Type v loc -> Type v loc -> Either (CompilerBug v loc) Bool Source #
data Suggestion v loc Source #
Constructors
| Suggestion | |
Fields
| |
Instances
| Show v => Show (Suggestion v loc) Source # | |
Defined in Unison.Typechecker.Context Methods showsPrec :: Int -> Suggestion v loc -> ShowS # show :: Suggestion v loc -> String # showList :: [Suggestion v loc] -> ShowS # | |
| Var v => Eq (Suggestion v loc) Source # | |
Defined in Unison.Typechecker.Context Methods (==) :: Suggestion v loc -> Suggestion v loc -> Bool # (/=) :: Suggestion v loc -> Suggestion v loc -> Bool # | |
data Replacement v Source #
Constructors
| ReplacementRef Referent | |
| ReplacementVar v |
Instances
| Show v => Show (Replacement v) Source # | |
Defined in Unison.Typechecker.Context Methods showsPrec :: Int -> Replacement v -> ShowS # show :: Replacement v -> String # showList :: [Replacement v] -> ShowS # | |
| Eq v => Eq (Replacement v) Source # | |
Defined in Unison.Typechecker.Context Methods (==) :: Replacement v -> Replacement v -> Bool # (/=) :: Replacement v -> Replacement v -> Bool # | |
| Ord v => Ord (Replacement v) Source # | |
Defined in Unison.Typechecker.Context Methods compare :: Replacement v -> Replacement v -> Ordering # (<) :: Replacement v -> Replacement v -> Bool # (<=) :: Replacement v -> Replacement v -> Bool # (>) :: Replacement v -> Replacement v -> Bool # (>=) :: Replacement v -> Replacement v -> Bool # max :: Replacement v -> Replacement v -> Replacement v # min :: Replacement v -> Replacement v -> Replacement v # | |
data SuggestionMatch Source #
Instances
| Show SuggestionMatch Source # | |
Defined in Unison.Typechecker.Context Methods showsPrec :: Int -> SuggestionMatch -> ShowS # show :: SuggestionMatch -> String # showList :: [SuggestionMatch] -> ShowS # | |
| Eq SuggestionMatch Source # | |
Defined in Unison.Typechecker.Context Methods (==) :: SuggestionMatch -> SuggestionMatch -> Bool # (/=) :: SuggestionMatch -> SuggestionMatch -> Bool # | |
| Ord SuggestionMatch Source # | |
Defined in Unison.Typechecker.Context Methods compare :: SuggestionMatch -> SuggestionMatch -> Ordering # (<) :: SuggestionMatch -> SuggestionMatch -> Bool # (<=) :: SuggestionMatch -> SuggestionMatch -> Bool # (>) :: SuggestionMatch -> SuggestionMatch -> Bool # (>=) :: SuggestionMatch -> SuggestionMatch -> Bool # max :: SuggestionMatch -> SuggestionMatch -> SuggestionMatch # min :: SuggestionMatch -> SuggestionMatch -> SuggestionMatch # | |
isExact :: Suggestion v loc -> Bool Source #