Sarek_typerval unify_or_error :
Sarek_types.typ ->
Sarek_types.typ ->
Sarek_ast.loc ->
(unit, Sarek_error.error list) Stdlib.resultUnify two types and convert unification errors to typed errors with location
Result-returning validators for type checking with error messages.
These functions validate types and return detailed error messages on failure. For simple boolean checks without errors, use predicates from Sarek_types:
Sarek_types.is_numericSarek_types.is_integerSarek_types.is_booleanSarek_types.is_floatSarek_types.is_tvarval check_numeric :
Sarek_types.typ ->
Sarek_ast.loc ->
(unit, Sarek_error.error list) Stdlib.resultCheck that a type is numeric (int32, int64, float32, float64).
See also: Sarek_types.is_numeric for bool predicate version.
val check_integer :
Sarek_types.typ ->
Sarek_ast.loc ->
(unit, Sarek_error.error list) Stdlib.resultCheck that a type is integer (int32, int64, int).
See also: Sarek_types.is_integer for bool predicate version.
val check_boolean :
Sarek_types.typ ->
Sarek_ast.loc ->
(unit, Sarek_error.error list) Stdlib.resultCheck that a type is boolean.
See also: Sarek_types.is_boolean for bool predicate version.
module TvarCtx : sig ... endType variable context for tracking named type variables like 'a, 'b
type tvar_ctx = {tvars : Sarek_types.typ TvarCtx.t Stdlib.ref;level : int;Level at which to create new type variables
*)}val fresh_tvar_ctx : ?level:int -> unit -> tvar_ctxCreate a fresh type variable context at a given level
val type_of_type_expr_ctx :
Sarek_env.t ->
tvar_ctx ->
Sarek_ast.type_expr ->
Sarek_types.typConvert a parsed type expression using the current typing environment and a type variable context for polymorphic type variables
val type_of_type_expr_env :
Sarek_env.t ->
Sarek_ast.type_expr ->
Sarek_types.typConvert a parsed type expression using the current typing environment. Creates fresh type variables for each TEVar - use type_of_type_expr_ctx when type variable names need to be preserved across multiple types.
val infer_binop :
Sarek_ast.binop ->
Sarek_types.typ ->
Sarek_types.typ ->
Sarek_ast.loc ->
(Sarek_types.typ, Sarek_error.error list) Stdlib.resultInfer type of a binary operation
val infer_unop :
Sarek_ast.unop ->
Sarek_types.typ ->
Sarek_ast.loc ->
(Sarek_types.typ, Sarek_error.error list) Stdlib.resultInfer type of a unary operation
These helpers partition the main infer function by expression category.
val infer_literal :
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
Sarek_typed_ast.texpr Sarek_error.resultInfer type of literal expressions (unit, bool, int, float constants).
val infer_binop_unop :
infer:
(Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
Sarek_env.t ->
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultInfer type of binary and unary operations (arithmetic, logical, bitwise).
val infer_memory_access :
infer:
(Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
Sarek_env.t ->
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultInfer type of memory access operations (vectors, arrays, record fields). Handles field resolution for both known and external record types.
val infer_control_flow :
infer:
(Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
Sarek_env.t ->
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultInfer type of control flow expressions (if, for, while, sequence). Ensures loop bounds are int32 and conditions are boolean.
val infer_data_structure :
infer:
(Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
infer_record_fields:
(Sarek_env.t ->
(string * Sarek_ast.expr) list ->
((string * Sarek_typed_ast.texpr) list * Sarek_env.t,
Sarek_error.error list)
Stdlib.result) ->
infer_list:
(Sarek_env.t ->
Sarek_ast.expr list ->
(Sarek_typed_ast.texpr list * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
Sarek_env.t ->
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultInfer type of data structures (records, variants, tuples, arrays). Uses mutual recursion helpers for complex nested structures.
val infer_special :
infer:
(Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
Sarek_env.t ->
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultInfer type of special expressions (global refs, native blocks, pragmas, type annotations, open). These handle meta-level constructs and environment manipulation.
val infer_let_binding :
infer:
(Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t, Sarek_error.error list)
Stdlib.result) ->
Sarek_env.t ->
Sarek_ast.loc ->
Sarek_ast.expr_desc ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultInfer type of let bindings (assign, let, let mut, let rec). Handles mutability constraints and recursive binding generalization.
val infer :
Sarek_env.t ->
Sarek_ast.expr ->
(Sarek_typed_ast.texpr * Sarek_env.t) Sarek_error.resultMain type inference function
val infer_list :
Sarek_env.t ->
Sarek_ast.expr list ->
(Sarek_typed_ast.texpr list * Sarek_env.t, Sarek_error.error list)
Stdlib.resultval unify_args :
Sarek_types.typ list ->
Sarek_typed_ast.texpr list ->
Sarek_ast.loc ->
(unit, Sarek_error.error list) Stdlib.resultval infer_record_fields :
Sarek_env.t ->
(string * Sarek_ast.expr) list ->
((string * Sarek_typed_ast.texpr) list * Sarek_env.t, Sarek_error.error list)
Stdlib.resultval infer_match_cases :
Sarek_env.t ->
Sarek_types.typ ->
(Sarek_ast.pattern * Sarek_ast.expr) list ->
Sarek_ast.loc ->
((Sarek_typed_ast.tpattern * Sarek_typed_ast.texpr) list
* Sarek_types.typ
* Sarek_env.t,
Sarek_error.error list)
Stdlib.resultval infer_remaining_cases :
Sarek_env.t ->
Sarek_types.typ ->
Sarek_types.typ ->
(Sarek_ast.pattern * Sarek_ast.expr) list ->
((Sarek_typed_ast.tpattern * Sarek_typed_ast.texpr) list,
Sarek_error.error list)
Stdlib.resultval infer_pattern :
Sarek_env.t ->
Sarek_types.typ ->
Sarek_ast.pattern ->
(Sarek_typed_ast.tpattern * Sarek_env.t, Sarek_error.error list)
Stdlib.resultval infer_patterns :
Sarek_env.t ->
Sarek_types.typ list ->
Sarek_ast.pattern list ->
(Sarek_typed_ast.tpattern list * Sarek_env.t, Sarek_error.error list)
Stdlib.resultval is_intrinsic_fun : Sarek_env.StringMap.key -> Sarek_env.t -> boolCheck if a name is an intrinsic function in the environment
val infer_kernel :
Sarek_env.t ->
Sarek_ast.kernel ->
Sarek_typed_ast.tkernel Sarek_error.resultType a complete kernel