введите +'at в библиотеке карт Ocaml?

Я работаю со встроенной библиотекой карт Ocaml для набора задач, и у меня возникают проблемы с доступом к типу данных самой карты. Предполагается, что это третья реализация словаря (первые две — это список и несбалансированное двоичное дерево поиска), и часть функтора, который мне нужно реализовать, — это «type dict», который является типом данных фактического словаря. Для списка введите dict was (D.key * D.value) list; для дерева тип dict был пустым | Ветвь ((D.key * D.value), словарь, словарь). Документация Ocaml говорит:

type +'a t 
The type of maps from type key to type 'a.

Это похоже на то, что мне нужно, но я не могу правильно его использовать. Кстати, M — это мой модуль Map.Make. я пробовал

type dict = M.t
type dict = M.+D.value t
type dict = M.+

Но я продолжаю получать сообщения об ошибках. Кто-нибудь может помочь? Большое спасибо!


person LBR    schedule 03.03.2011    source источник


Ответы (2)


+ — это аннотация отклонения, она не является частью имени. Синтаксис параметризованного типа — param type или (param, param, ...) type в OCaml: int list, (int, string) Hashbl.t. Здесь вам нужно D.value M.t.

person gasche    schedule 03.03.2011
comment
Как «+» не является синтаксической конструкцией? - person Chris Conway; 03.03.2011
comment
Перед каждым параметром типа может стоять ограничение дисперсии + (соответственно -), указывающее, что параметр является ковариантным (соответственно контравариантным). из caml.inria.fr/pub/docs/manual-ocaml/manual016 .html. Он разрешает/запрещает подтипирование в системе вариантов и объектов. - person nlucaroni; 03.03.2011
comment
Конечно, моя формулировка была неправильной. Конечно, почти все является синтаксической конструкцией, и я отредактировал свой ответ. - person gasche; 03.03.2011
comment
Большое спасибо! D.value M.t работает! Очень ценю помощь. - person LBR; 03.03.2011

Вы можете узнать это сами, спросив у компилятора ocaml: ocamlc -i file.ml

Для создания карты через Map.Make из стандартной библиотеки ocaml этот файл будет выглядеть так (для карты от int до 'a):

module Intmap = Map.Make (struct
   type t = int
   let compare = Pervasives.compare
end)

Компилятор ocaml выдаст вам что-то вроде этого (при вызове ocamlc -i mymap.ml):

module Intmap :
   sig
      type key = int
      type +'a t
      val empty : 'a t
      ...
end
person lambdapower    schedule 03.03.2011