Hello, I am learning how module works in OCaml.
(Edit: sorry guys, I figured what went wrong with my first code example, the code below is working now)
First question, I don’t quite get why the example code below is not working:
file: lib/s.ml
module type S = sig
type error
type t
val get : string -> (t option, error) result Lwt.t
end;;
module Q = struct
type error = Some_error of string
type t = { id : int64 }
let get s =
match s with
| "ok" -> Lwt.return (Ok (Some { id = 1L }))
| _ -> Lwt.return (Error (Some_error "error"))
end
module Q_s : S = Q
The error message I am getting:
File "lib/s.ml", line 17, characters 17-18:
Error: Signature mismatch:
...
Values do not match:
val get : string -> (int option, error) result Lwt.t
is not included in
val get : string -> (t option, error) result Lwt.t
File "lib/s.ml", line 4, characters 2-52: Expected declaration
File "lib/s.ml", line 11, characters 6-9: Actual declaration
I can’t seem to make t
concreate (e.g. a record)…
Second question, the above code snippet e.g. is in lib/s.ml
, suppose I create another file lib/s.mli
with
module type S = sig
type error
type t
val get : string -> (t option, error) result Lwt.t
end;;
And I have to include the above piece of code in lib/s.ml
as well which is a bit redundant, I thought it might be sufficient to have the module type S
just in mli
file, apparently the compiler would complain Unbound module S
…