как мне может удаться определить 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, так как я ни один не уверен, что это возможно).
Эта проблема может быть решена в некотором роде?
Вы можете использовать рекурсивные модули. Руководство по языку использует точно такой же пример рекурсивного типа множества для иллюстрации этой возможности языка. Ниже приводится соответствующий отрывок.
Типичный пример определения рекурсивного модуля:
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