У меня есть два типа модулей:
module type ORDERED =
sig
type t
val eq : t * t -> bool
val lt : t * t -> bool
val leq : t * t -> bool
end
module type STACK =
sig
exception Empty
type 'a t
val empty : 'a t
val isEmpty : 'a t -> bool
val cons : 'a * 'a t -> 'a t
val head : 'a t -> 'a
val tail : 'a t -> 'a t
val length : 'a t -> int
end
Я хочу написать функтор, который "поднимает" отношение порядка с базового типа ORDERED
до STACKs
этого типа.Это можно сделать, сказав, что, например, два стека элементов будут равны, если все его отдельные элементы равны.И что стеки s1 и s2 являются st s1
module StackLift (O : ORDERED) (S : STACK) : ORDERED =
struct
type t = O.t S.t
let rec eq (x,y) =
if S.isEmpty x
then if S.isEmpty y
then true
else false
else if S.isEmpty y
then false
else if O.eq (S.head x,S.head y)
then eq (S.tail x, S.tail y)
else false
(* etc for lt and leq *)
end
, что является очень неуклюжим способом выполнения сопоставления с шаблоном.Альтернативой может быть навязывание определения типа STACK.t
с использованием явных конструкторов, но это в некоторой степени связывает мой модуль general с конкретной реализацией, чего я не хочу делать.* Вопрос : могу ли я определить что-то другое выше, чтобы я мог все еще использовать сопоставление с образцом, сохраняя при этом общность типов модулей?