In the following functions, the ~leave_unresolved labeled parameter controls the behavior of the typer in the case where polymorphic expressions are still found after typing: if set to true, it allows them (giving them TAny and losing typing information), if set to false, it aborts.
val expr :
leave_unresolved:bool ->Shared_ast__.Definitions.decl_ctx->?env:'eEnv.t->?typ:Shared_ast__.Definitions.naked_typCatala_utils.Mark.pos->(('a, 'a, 'm)Shared_ast__.Definitions.base_gexpr,
'mShared_ast__.Definitions.mark)Catala_utils.Mark.edas 'e ->(('a, 'a, Shared_ast__.Definitions.typed)Shared_ast__.Definitions.base_gexprBindlib.box,
Shared_ast__.Definitions.typedShared_ast__.Definitions.mark)Catala_utils.Mark.ed
Infers and marks the types for the given expression. If typ is provided, it is assumed to be the outer type and used for inference top-down.
If the input expression already has type annotations, the full inference is still done, but with unification with the existing annotations at every step. This can be used for double-checking after AST transformations and filling the gaps (TAny) if any. Use Expr.untype first if this is not what you want.
Note that typing also transparently performs the following changes to the AST nodes, outside of typing annotations:
disambiguation of constructors: EDStructAccess nodes are translated into EStructAccess with the suitable structure and field idents (this only concerns desugared expressions).
resolution of operator types, which are stored (monomorphised) back in the EAppOp nodes
resolution of function application input types on the EApp nodes, when that was originally empty ([]): this documents the arity of the function application, taking de-tuplification into account.
TAny appearing within nodes are refined to more precise types, e.g. on `EAbs` nodes (but be careful with this, it may only work for specific structures of generated code ; ~leave_unresolved:false checks that it didn't cause problems)
val check_expr :
leave_unresolved:bool ->Shared_ast__.Definitions.decl_ctx->?env:'eEnv.t->?typ:Shared_ast__.Definitions.naked_typCatala_utils.Mark.pos->(('a, 'a, 'm)Shared_ast__.Definitions.base_gexpr,
'mShared_ast__.Definitions.mark)Catala_utils.Mark.edas 'e ->(('a, 'a, Shared_ast__.Definitions.untyped)Shared_ast__.Definitions.base_gexprBindlib.box,
Shared_ast__.Definitions.untypedShared_ast__.Definitions.mark)Catala_utils.Mark.ed
Same as expr, but doesn't annotate the returned expression. Equivalent to Typing.expr |> Expr.untype, but more efficient. This can be useful for type-checking and disambiguation (some AST nodes are updated with missing information, e.g. any TAny appearing in the AST is replaced)
val program :
leave_unresolved:bool ->(('a, 'a, 'm)Shared_ast__.Definitions.base_gexpr,
'mShared_ast__.Definitions.mark)Catala_utils.Mark.edShared_ast__.Definitions.program->(('a, 'a, Shared_ast__.Definitions.typed)Shared_ast__.Definitions.base_gexpr,
Shared_ast__.Definitions.typedShared_ast__.Definitions.mark)Catala_utils.Mark.edShared_ast__.Definitions.program
Typing on whole programs (as defined in Shared_ast.program, i.e. for the later dcalc/lcalc stages.
Any existing type annotations are checked for unification. Use Program.untype to remove them beforehand if this is not the desired behaviour.