如何在子模块中使用模块中创建的异常(在ocaml中)

时间:2018-05-28 08:33:47

标签: module ocaml

我有一个带有异常的模块类型AA将由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类型

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

1 个答案:

答案 0 :(得分:2)

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