Copyright | Copyright (c) 2017 the Hakaru team |
---|---|
License | BSD3 |
Stability | experimental |
Portability | GHC-only |
Safe Haskell | None |
Language | Haskell2010 |
Bidirectional type checking for our AST.
Synopsis
- type Input = Maybe (Vector Text)
- type Ctx = VarSet ('KProxy :: KProxy Hakaru)
- data TypeCheckMode
- type TypeCheckError = Text
- newtype TypeCheckMonad a = TCM {
- unTCM :: Ctx -> Input -> TypeCheckMode -> Either TypeCheckError a
- runTCM :: TypeCheckMonad a -> Input -> TypeCheckMode -> Either TypeCheckError a
- getInput :: TypeCheckMonad Input
- getMode :: TypeCheckMonad TypeCheckMode
- pushCtx :: Variable (a :: Hakaru) -> TypeCheckMonad b -> TypeCheckMonad b
- getCtx :: TypeCheckMonad Ctx
- failwith :: TypeCheckError -> TypeCheckMonad r
- failwith_ :: TypeCheckError -> TypeCheckMonad r
- try :: TypeCheckMonad a -> TypeCheckMonad (Maybe a)
- tryWith :: TypeCheckMode -> TypeCheckMonad a -> TypeCheckMonad (Maybe a)
- makeErrMsg :: Text -> Maybe SourceSpan -> Text -> TypeCheckMonad TypeCheckError
- typeMismatch :: Maybe SourceSpan -> Either Text (Sing (a :: Hakaru)) -> Either Text (Sing (b :: Hakaru)) -> TypeCheckMonad r
- missingInstance :: Text -> Sing (a :: Hakaru) -> Maybe SourceSpan -> TypeCheckMonad r
- missingLub :: Sing (a :: Hakaru) -> Sing (b :: Hakaru) -> Maybe SourceSpan -> TypeCheckMonad r
- ambiguousFreeVariable :: Text -> Maybe SourceSpan -> TypeCheckMonad r
- ambiguousNullCoercion :: Maybe SourceSpan -> TypeCheckMonad r
- ambiguousEmptyNary :: Maybe SourceSpan -> TypeCheckMonad r
- ambiguousMustCheckNary :: Maybe SourceSpan -> TypeCheckMonad r
- ambiguousMustCheck :: Maybe SourceSpan -> TypeCheckMonad r
- argumentNumberError :: TypeCheckMonad r
- data TypedAST (abt :: [Hakaru] -> Hakaru -> *) = forall b. TypedAST !(Sing b) !(abt '[] b)
- onTypedAST :: (forall b. abt '[] b -> abt '[] b) -> TypedAST abt -> TypedAST abt
- onTypedASTM :: Functor m => (forall b. abt '[] b -> m (abt '[] b)) -> TypedAST abt -> m (TypedAST abt)
- elimTypedAST :: (forall b. Sing b -> abt '[] b -> x) -> TypedAST abt -> x
- data TypedASTs (abt :: [Hakaru] -> Hakaru -> *) = forall b. TypedASTs !(Sing b) [abt '[] b]
- data TypedReducer (abt :: [Hakaru] -> Hakaru -> *) (xs :: [Hakaru]) = forall b. TypedReducer !(Sing b) (List1 Variable xs) (Reducer abt xs b)
- data SomePattern (a :: Hakaru) = forall vars. SP !(Pattern vars a) !(List1 Variable vars)
- data SomePatternCode xss t = forall vars. SPC !(PDatumCode xss vars (HData' t)) !(List1 Variable vars)
- data SomePatternStruct xs t = forall vars. SPS !(PDatumStruct xs vars (HData' t)) !(List1 Variable vars)
- data SomePatternFun x t = forall vars. SPF !(PDatumFun x vars (HData' t)) !(List1 Variable vars)
- data SomeBranch a abt = forall b. SomeBranch !(Sing b) [Branch a abt b]
- makeVar :: forall (a :: Hakaru). Variable 'U -> Sing a -> Variable a
- make_NaryOp :: Sing a -> NaryOp -> TypeCheckMonad (NaryOp a)
- isBool :: Sing a -> TypeCheckMonad (TypeEq a HBool)
- jmEq1_ :: Sing (a :: Hakaru) -> Sing (b :: Hakaru) -> TypeCheckMonad (TypeEq a b)
- getHEq :: Sing a -> TypeCheckMonad (HEq a)
- getHOrd :: Sing a -> TypeCheckMonad (HOrd a)
- getHSemiring :: Sing a -> TypeCheckMonad (HSemiring a)
- getHRing :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeRing a)
- getHFractional :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeFractional a)
- lc :: (LC_ abt a -> LC_ abt b) -> abt '[] a -> abt '[] b
- coerceTo_nonLC :: ABT Term abt => Coercion a b -> abt xs a -> abt xs b
- coerceFrom_nonLC :: ABT Term abt => Coercion a b -> abt xs b -> abt xs a
Documentation
type Input = Maybe (Vector Text) Source #
- Definition of the typechecking monad and related types/functions/instances.
data TypeCheckMode Source #
Instances
Read TypeCheckMode Source # | |
Defined in Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad readsPrec :: Int -> ReadS TypeCheckMode # readList :: ReadS [TypeCheckMode] # | |
Show TypeCheckMode Source # | |
Defined in Language.Hakaru.Syntax.TypeCheck.TypeCheckMonad showsPrec :: Int -> TypeCheckMode -> ShowS # show :: TypeCheckMode -> String # showList :: [TypeCheckMode] -> ShowS # |
type TypeCheckError = Text Source #
newtype TypeCheckMonad a Source #
TCM | |
|
Instances
runTCM :: TypeCheckMonad a -> Input -> TypeCheckMode -> Either TypeCheckError a Source #
getInput :: TypeCheckMonad Input Source #
Return the mode in which we're checking/inferring types.
getMode :: TypeCheckMonad TypeCheckMode Source #
Return the mode in which we're checking/inferring types.
pushCtx :: Variable (a :: Hakaru) -> TypeCheckMonad b -> TypeCheckMonad b Source #
Extend the typing context, but only locally.
failwith :: TypeCheckError -> TypeCheckMonad r Source #
failwith_ :: TypeCheckError -> TypeCheckMonad r Source #
try :: TypeCheckMonad a -> TypeCheckMonad (Maybe a) Source #
a la optional :: Alternative f => f a -> f (Maybe a)
but
without needing the empty
of the Alternative
class.
tryWith :: TypeCheckMode -> TypeCheckMonad a -> TypeCheckMonad (Maybe a) Source #
Tries to typecheck in a given mode
makeErrMsg :: Text -> Maybe SourceSpan -> Text -> TypeCheckMonad TypeCheckError Source #
- Helpers for constructing error messages
typeMismatch :: Maybe SourceSpan -> Either Text (Sing (a :: Hakaru)) -> Either Text (Sing (b :: Hakaru)) -> TypeCheckMonad r Source #
Fail with a type-mismatch error.
missingInstance :: Text -> Sing (a :: Hakaru) -> Maybe SourceSpan -> TypeCheckMonad r Source #
missingLub :: Sing (a :: Hakaru) -> Sing (b :: Hakaru) -> Maybe SourceSpan -> TypeCheckMonad r Source #
ambiguousFreeVariable :: Text -> Maybe SourceSpan -> TypeCheckMonad r Source #
data TypedAST (abt :: [Hakaru] -> Hakaru -> *) Source #
- Terms whose type is existentially quantified packed with a singleton for the type.
The e' ∈ τ
portion of the inference judgement.
onTypedAST :: (forall b. abt '[] b -> abt '[] b) -> TypedAST abt -> TypedAST abt Source #
onTypedASTM :: Functor m => (forall b. abt '[] b -> m (abt '[] b)) -> TypedAST abt -> m (TypedAST abt) Source #
elimTypedAST :: (forall b. Sing b -> abt '[] b -> x) -> TypedAST abt -> x Source #
data TypedReducer (abt :: [Hakaru] -> Hakaru -> *) (xs :: [Hakaru]) Source #
forall b. TypedReducer !(Sing b) (List1 Variable xs) (Reducer abt xs b) |
data SomePatternCode xss t Source #
forall vars. SPC !(PDatumCode xss vars (HData' t)) !(List1 Variable vars) |
data SomePatternStruct xs t Source #
forall vars. SPS !(PDatumStruct xs vars (HData' t)) !(List1 Variable vars) |
data SomePatternFun x t Source #
data SomeBranch a abt Source #
forall b. SomeBranch !(Sing b) [Branch a abt b] |
make_NaryOp :: Sing a -> NaryOp -> TypeCheckMonad (NaryOp a) Source #
getHSemiring :: Sing a -> TypeCheckMonad (HSemiring a) Source #
getHRing :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeRing a) Source #
getHFractional :: Sing a -> TypeCheckMode -> TypeCheckMonad (SomeFractional a) Source #