我的模块类型为A,但有一个例外。 A将由BC实现

module type A = sig
  type t
  val f: t->t->t
  exception DivisionParZero
end


module B : A = struct
  type t = int
  let f a b=
    if (a==0) then raise DivisionParZero else b/a
  end
end

Ocamlc说它在编译B时:

错误:此变体表达式的类型应为exn
构造函数DivisionParZero不属于exn类型

我不明白为什么它不起作用。

最佳答案

AB需要满足的签名。在您的上下文中,这意味着您必须再次编写声明行:

module B : A = struct
  type t = int
  exception DivisionParZero
  let f a b=
    if (a==0) then raise DivisionParZero else b/a
end

您可以通过返回一个随机值而不是引发异常来进行一些试验,您会看到编译器告诉您您的实现不适合签名:
Error: Signature mismatch:
   Modules do not match:
     sig type t = int val f : int -> int -> int end
   is not included in
     A
   The extension constructor `DivisionParZero' is required but not provided
   File "test.ml", line 4, characters 2-27: Expected declaration

07-24 09:55