package catala
Install
dune-project
Dependency
Authors
Maintainers
Sources
md5=1408a1cce45c7d5990b981e83e7589c2
sha512=eb3b923aa1f743378b4a05e30f50be5d180dc862a716270d747a90e469017f42fa5fc41352f02fbbf59cd2560f91c4f1b32cf38d80085b105d9387b0aed2039d
doc/catala.shared_ast/Shared_ast/Operator/index.html
Module Shared_ast.OperatorSource
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 theEOpexpression node. Shared_ast.TypingTyping 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 -> 'aisn't encoded in the first-order AST types).Finally, during
Scopelang.From_desugaredTranslation fromDesugared.AsttoScopelang.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 ->
'bCalls 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)
tAn 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.posval 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.posval 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.posThe 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.