модуль типа с уже реализованной функцией ocaml - PullRequest
0 голосов
/ 28 мая 2018

У меня есть тип модуля Order, который будет реализован в нескольких модулях.Функция сравнения будет реализована в модулях.

module type Order = 
sig
  type t
  val compare: t -> t -> int
end

Я также хочу создать функцию max:

max a b = if (compare a b > 0) then a else b

Я хотел бы написать определение (а не просто объявление) этогоФункция в моем модуле Order, чтобы избежать переписывания одного и того же определения в подмодуле, которые многочисленны.

Я пробовал:

val max a b = if (compare a b > 0) then a else b

и

let max a b = if (compare a b > 0) then a else b

но это не работает

1 Ответ

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

Вы не можете реализовать функции в сигнатуре модуля.Я думаю, что проблема, с которой вы столкнулись, решается с помощью функторов в OCaml.

Пример кода, который вы можете посмотреть, чтобы понять, как это работает, - реализация Set .

В вашем случае это будет выглядеть примерно так:
РЕДАКТИРОВАТЬ: принимая во внимание вклады Ричарда Дегенна, октахрона и PatJ:

module type Order =
sig
  type t
  val compare: t -> t -> int
end

module type Util =
sig
  type t
  val compare: t -> t -> int
  val max: t -> t -> t
end

module Make(Ord: Order): Util with type t := Ord.t =
struct
  type t = Ord.t
  let compare = Ord.compare
  let max a b = if (Ord.compare a b > 0) then a else b
end

Чтобы использовать его, вы можете сделать:

(*You first define a module for the specific case of int*)
module IntOrder = struct
  type t = int
  let compare = compare
end

(*You use the new module to build the corresponding Util module*)
module IntUtil = Make(IntOrder)

(*You can now use the functions defined in Util as if it was any other module*)
let x = IntUtil.max 1 2
let y = IntUtil.compare 1 2

(*But if you try to call it with the wrong type you get an error*)
let z = IntUtil.compare 1.6 2.5
...