Рекурсивное множество в OCaml

как мне может удаться определить a Set в OCaml, который может, содержит элемент его типа также?

Для объяснения проблемы, у меня есть описание типа для большого количества типов данных как

type value =
  Nil
| Int of int
| Float of float
| Complex of Complex.t
| String of string
| Regexp of regexp
| Char of char
| Bool of bool
| Range of (int*int) list
| Tuple of value array
| Lambda of code
| Set of ValueSet.t (* this isn't allowed in my case since module is declared later*)

Кроме того, я объявляю конкретный модуль для ValueSet позже в том же файле:

module ValueSet = Set.Make(struct type t = value let compare = Pervasives.compare end)

Проблема - это ValueSet имеет value поскольку это - тип elt, но value может быть a ValueSet таким образом, я получаю проблемы при попытке скомпилировать его.

Все эти объявления содержатся в просто названном файле types.ml (который имеет свой собственный интерфейс types.mli но ни с кем ValueSet модуль decl, так как я ни один не уверен, что это возможно).

Эта проблема может быть решена в некотором роде?

5
задан Jack 11 July 2010 в 17:17
поделиться

1 ответ

Вы можете использовать рекурсивные модули. Руководство по языку использует точно такой же пример рекурсивного типа множества для иллюстрации этой возможности языка. Ниже приводится соответствующий отрывок.

Типичный пример определения рекурсивного модуля:

module rec A : sig
 type t = Leaf of string | Node of ASet.t
 val compare: t -> t -> int
 end
 = struct
 type t = Leaf of string | Node of ASet.t
 let compare t1 t2 =
 сравнить (t1, t2) с
 (Leaf s1, Leaf s2) -> Pervasives.compare s1 s2
 | (Лист _, Узел _) -> 1
 | (Узел _, Лист _) -> -1
 | (Узел n1, Узел n2) -> ASet.compare n1 n2
 end
 и ASet : Set.S с типом elt = A.t
 = Set.Make(A)

Можно дать следующую спецификацию:

module rec A : sig
 type t = Leaf of string | Node of ASet.t
 val compare: t -> t -> int
 end
 и ASet : Set.S с типом elt = A.t
6
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: