package catala
Install
Dune Dependency
Authors
Maintainers
Sources
md5=1408a1cce45c7d5990b981e83e7589c2
sha512=eb3b923aa1f743378b4a05e30f50be5d180dc862a716270d747a90e469017f42fa5fc41352f02fbbf59cd2560f91c4f1b32cf38d80085b105d9387b0aed2039d
doc/catala.shared_ast/Shared_ast/Operator/index.html
Module Shared_ast.Operator
Source
Catala operator utilities
Resolving operators from the surface syntax proceeds in three steps:
- During desugaring, the operators may remain untyped (with
TAny
) or, if they have an explicit type suffix (e.g. the$
for "money" in+$
), their operands types are already explicited in theEOp
expression node. Shared_ast.Typing
Typing for the default calculus. Because of the error terms, we perform type inference using the classical W algorithm with union-find unification.
will then enforce these constraints in addition to the known built-in type for each operator (e.g.
Eq: 'a -> 'a -> 'a
isn't encoded in the first-order AST types).Finally, during
Scopelang.From_desugared
Translation fromDesugared.Ast
toScopelang.Ast
, these types are leveraged to resolve the overloaded operators to their concrete, monomorphic counterparts
type (_, _) kind =
| Monomorphic : ('a Shared_ast__.Definitions.any, monomorphic) kind
| Polymorphic : ('a Shared_ast__.Definitions.any, polymorphic) kind
| Overloaded : ([< Shared_ast__.Definitions.desugared ], overloaded) kind
| Resolved : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) kind
Classification of operators. This could be inlined in the definition of t
but is more concise this way
type (_, _) t =
| Not : ('a Shared_ast__.Definitions.any, monomorphic) t
| GetDay : ('a Shared_ast__.Definitions.any, monomorphic) t
| GetMonth : ('a Shared_ast__.Definitions.any, monomorphic) t
| GetYear : ('a Shared_ast__.Definitions.any, monomorphic) t
| FirstDayOfMonth : ('a Shared_ast__.Definitions.any, monomorphic) t
| LastDayOfMonth : ('a Shared_ast__.Definitions.any, monomorphic) t
| Length : ('a Shared_ast__.Definitions.any, polymorphic) t
| Log : Shared_ast__.Definitions.log_entry * Catala_utils.Uid.MarkedString.info list -> ('a Shared_ast__.Definitions.any, polymorphic) t
| Minus : ([ `Desugared ], overloaded) t
| Minus_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Minus_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Minus_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Minus_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| ToRat : ([ `Desugared ], overloaded) t
| ToRat_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| ToRat_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| ToMoney : ([ `Desugared ], overloaded) t
| ToMoney_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Round : ([ `Desugared ], overloaded) t
| Round_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Round_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| And : ('a Shared_ast__.Definitions.any, monomorphic) t
| Or : ('a Shared_ast__.Definitions.any, monomorphic) t
| Xor : ('a Shared_ast__.Definitions.any, monomorphic) t
| Eq : ('a Shared_ast__.Definitions.any, polymorphic) t
| Map : ('a Shared_ast__.Definitions.any, polymorphic) t
| Concat : ('a Shared_ast__.Definitions.any, polymorphic) t
| Filter : ('a Shared_ast__.Definitions.any, polymorphic) t
| Reduce : ('a Shared_ast__.Definitions.any, polymorphic) t
| Add : ([ `Desugared ], overloaded) t
| Add_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Add_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Add_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Add_dat_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Add_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Sub : ([ `Desugared ], overloaded) t
| Sub_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Sub_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Sub_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Sub_dat_dat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Sub_dat_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Sub_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Mult : ([ `Desugared ], overloaded) t
| Mult_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Mult_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Mult_mon_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Mult_dur_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Div : ([ `Desugared ], overloaded) t
| Div_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Div_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Div_mon_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Div_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Div_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lt : ([ `Desugared ], overloaded) t
| Lt_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lt_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lt_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lt_dat_dat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lt_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lte : ([ `Desugared ], overloaded) t
| Lte_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lte_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lte_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lte_dat_dat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Lte_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gt : ([ `Desugared ], overloaded) t
| Gt_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gt_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gt_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gt_dat_dat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gt_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gte : ([ `Desugared ], overloaded) t
| Gte_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gte_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gte_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gte_dat_dat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Gte_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Eq_int_int : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Eq_rat_rat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Eq_mon_mon : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Eq_dur_dur : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Eq_dat_dat : ([< Shared_ast__.Definitions.scopelang | Shared_ast__.Definitions.dcalc | Shared_ast__.Definitions.lcalc ], resolved) t
| Fold : ('a Shared_ast__.Definitions.any, polymorphic) t
Returns the operator name as a valid ident starting with a lowercase character. This is different from Print.operator which returns operator symbols, e.g. +$
.
val kind_dispatch :
polymorphic:((_ Shared_ast__.Definitions.any, polymorphic) t -> 'b) ->
monomorphic:((_ Shared_ast__.Definitions.any, monomorphic) t -> 'b) ->
?overloaded:(([ `Desugared ], overloaded) t -> 'b) ->
?resolved:
(([< Shared_ast__.Definitions.scopelang
| Shared_ast__.Definitions.dcalc
| Shared_ast__.Definitions.lcalc ],
resolved)
t ->
'b) ->
('a, 'k) t ->
'b
Calls one of the supplied functions depending on the kind of the operator
val translate :
([< Shared_ast__.Definitions.scopelang
| Shared_ast__.Definitions.dcalc
| Shared_ast__.Definitions.lcalc ],
'k)
t ->
([< Shared_ast__.Definitions.scopelang
| Shared_ast__.Definitions.dcalc
| Shared_ast__.Definitions.lcalc ],
'k)
t
An identity function that allows translating an operator between different passes that don't change operator types
Getting the types of operators
val monomorphic_type :
('a Shared_ast__.Definitions.any, monomorphic) t Catala_utils.Marked.pos ->
Shared_ast__.Definitions.naked_typ Catala_utils.Marked.pos
val resolved_type :
([< Shared_ast__.Definitions.scopelang
| Shared_ast__.Definitions.dcalc
| Shared_ast__.Definitions.lcalc ],
resolved)
t
Catala_utils.Marked.pos ->
Shared_ast__.Definitions.naked_typ Catala_utils.Marked.pos
val overload_type :
Shared_ast__.Definitions.decl_ctx ->
([ `Desugared ], overloaded) t Catala_utils.Marked.pos ->
Shared_ast__.Definitions.naked_typ Catala_utils.Marked.pos list ->
Shared_ast__.Definitions.naked_typ Catala_utils.Marked.pos
The type for typing overloads is different since the types of the operands are required in advance.
Polymorphic operators are typed directly within Typing
, since their types may contain type variables that can't be expressed outside of it
Overload handling
val resolve_overload :
Shared_ast__.Definitions.decl_ctx ->
([ `Desugared ], overloaded) t Catala_utils.Marked.pos ->
Shared_ast__.Definitions.naked_typ Catala_utils.Marked.pos list ->
([< Shared_ast__.Definitions.scopelang
| Shared_ast__.Definitions.dcalc
| Shared_ast__.Definitions.lcalc ],
resolved)
t
* [ `Straight | `Reversed ]
Some overloads are sugar for an operation with reversed operands, e.g. TRat * TMoney
is using mult_mon_rat
. `Reversed
is returned to signify this case.