Как использовать в подмодуле исключение, созданное в модуле (в ocaml) - PullRequest
0 голосов
/ 28 мая 2018

У меня есть тип модуля 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

Я не понимаю, почему он не работает.

1 Ответ

0 голосов
/ 28 мая 2018

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
...