我有一个带有异常的模块类型A
。 A
将由B
和C
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类型
我不明白为什么它不起作用。
答案 0 :(得分:2)
A
是B
需要履行的签名。在您的上下文中,这意味着您必须再次编写声明行:
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