1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[@@@ocaml.text "/*"]
(** Copyright 2021-2026, Kakadu and contributors *)
(** SPDX-License-Identifier: LGPL-3.0-or-later *)
[@@@ocaml.text "/*"]
open Ast
let int_cons n = Int n
let var x = Var x
let abs x l = Abs (x, l)
let app l r = App (l, r)
(* TODO: rework this *)
module type MONAD_FAIL = sig
include Base.Monad.S2
val fail : 'e -> ('a, 'e) t
end
type output =
| OUnit
| OInt of int
| OAbs of name * name t
| OBuiltin of name
type error =
| UnknownVariable of string
| TypeError of string
| DivisionByZero
| ProgramFreeze
module type MONAD = sig
type 'a t
val return : 'a -> 'a t
val ( let* ) : 'a t -> ('a -> 'b t) -> 'b t
end
module type MONADERROR = sig
include MONAD
val fail : error -> 'a t
end
module RESULT : MONADERROR with type 'a t = ('a, error) Result.t = struct
type 'a t = ('a, error) Result.t
let return x = Ok x
let fail x = Error x
let ( let* ) m f =
match m with
| Ok x -> f x
| Error e -> Error e
;;
end