тип +'a t в Ocaml Map Library?

Работя с вградената библиотека Map на Ocaml за набор от проблеми и имам проблем с достъпа до типа данни на самата карта. Предполага се, че това е третото изпълнение на речник (първите две са списък и небалансирано двоично дърво за търсене), а част от функтора, който трябва да внедря, е "type dict", който е типът данни на действителния речник. За списък въведете dict беше (D.key * D.value) списък; за дървото тип dict беше Empty | Клон ((D.key * D.value), dict, dict). Документацията на 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