我的模块类型为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类型
我不明白为什么它不起作用。
最佳答案
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