package catala
Install
dune-project
Dependency
Authors
Maintainers
Sources
md5=c41cbc1fa003e167bbc0bb1cd7723ab3
sha512=1e07951e2d73040bc0bea89f04bcb50c3a533323a7c7d8bac9ee9aa6be5233f795a32857421d04f17e52a841057cdc78b33f79fa239a17dd12de97a738c81999
doc/catala.shared_ast/Shared_ast/Typing/index.html
Module Shared_ast.TypingSource
Typing for the default calculus. Because of the error terms, we perform type inference using the classical W algorithm with union-find unification.
val expr :
Shared_ast__.Definitions.decl_ctx ->
?env:'e Env.t ->
?typ:Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos ->
((('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr,
'm Shared_ast__.Definitions.mark)
Catala_utils.Mark.ed as 'e) ->
(('a, 'a, Shared_ast__.Definitions.typed) Shared_ast__.Definitions.base_gexpr
Bindlib.box,
Shared_ast__.Definitions.typed Shared_ast__.Definitions.mark)
Catala_utils.Mark.edInfers 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 (TForAll) 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:
EDStructAccessnodes are translated intoEStructAccesswith the suitable structure and field idents (this only concernsdesugaredexpressions). - disambiguation of structure names in
EDStructAmendnodes (desugaredas well) - resolution of tuple size (when equal to 0) on
ETupleAccessnodes - resolution of operator types, which are stored (monomorphised) back in the
EAppOpnodes - resolution of function application input types on the
EAppnodes, when that was originally empty ([]): this documents the arity of the function application, taking de-tuplification into account. TForAllappearing 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)
val check_expr :
Shared_ast__.Definitions.decl_ctx ->
?env:'e Env.t ->
?typ:Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos ->
((('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr,
'm Shared_ast__.Definitions.mark)
Catala_utils.Mark.ed as 'e) ->
(('a, 'a, Shared_ast__.Definitions.untyped)
Shared_ast__.Definitions.base_gexpr
Bindlib.box,
Shared_ast__.Definitions.untyped Shared_ast__.Definitions.mark)
Catala_utils.Mark.edSame 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 TForAll appearing in the AST is replaced)
val program :
?assume_op_types:bool ->
?internal_check:bool ->
(('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr,
'm Shared_ast__.Definitions.mark)
Catala_utils.Mark.ed
Shared_ast__.Definitions.program ->
(('a, 'a, Shared_ast__.Definitions.typed) Shared_ast__.Definitions.base_gexpr,
Shared_ast__.Definitions.typed Shared_ast__.Definitions.mark)
Catala_utils.Mark.ed
Shared_ast__.Definitions.programTyping 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.
If internal_check is set to true, typing errors will be marked as internal, and the faulty program will be printed if '--debug' is set.