Вы ищете декартово произведение двух наборов.
Этот вопрос был задан в теме в списке рассылки OCaml. Этот ответ предлагает Брайан Херт : Для
module TypeSet = Set.Make(Type);;
Создать, чтобы представить продукт:
module TypeType = struct
type t = Type.t * Type.t;;
let compare (x1, x2) (y1, y2) =
let r = Type.compare x1 y1 in
if r == 0 then
Type.compare x2 y2
else
r
;;
end;;
module TypeTypeSet = Set.Make(TypeType);;
Затем сгенерируйте продукт с помощью:
let cartesian_product s1 s2 =
let f x y t = TypeTypeSet.add (x, y) t in
let g x t = TypeSet.fold (f x) s2 t in
TypeSet.fold g s1 TypeTypeSet.empty
;;