TL; DR - В OCaml как вызывать тип выглядит как type 'elt set = (module BatSet.S with type elt = 'elt)
и как сделать значение этого типа?
В настоящее время я читаю код в протокол Tezos [*], и я увидел следующий код:
module type Boxed_set = sig
type elt
val elt_ty : elt comparable_ty
module OPS : S.SET with type elt = elt
val boxed : OPS.t
val size : int
end
type 'elt set = (module Boxed_set with type elt = 'elt)
Я никогда не слышал о синтаксисе типа type a = (module B)
. Поэтому я открываю интерпретатор OCaml верхнего уровня и воспроизводю аналогичное использование, используя модуль battery . Следующий код - это журнал того, что я воспроизвел.
$ ocaml
OCaml version 4.07.1
# #use "topfind";;
- : unit = ()
Findlib has been successfully loaded. Additional directives:
#require "package";; to load a package
#list;; to list the available packages
#camlp4o;; to load camlp4 (standard syntax)
#camlp4r;; to load camlp4 (revised syntax)
#predicates "p,q,...";; to set these predicates
Topfind.reset();; to force that packages will be reloaded
#thread;; to enable threads
- : unit = ()
# #require "batteries";;
[...]: loaded
# type 'elt set = (module BatSet.S with type elt = 'elt);;
type 'elt set = (module BatSet.S with type elt = 'elt)
Это странное определение типа действительно работает, но я застрял здесь. Как сам модуль может быть типом? Как сделать значение типа 'elt set
как let v : int set = (...)
? Есть ли какое-либо ключевое слово для вызова таких типов?
[*] https://gitlab.com/tezos/tezos/blob/master/src/proto_alpha/lib_protocol/script_typed_ir.ml, Commit-Ha sh: 86b5227f7efd8aa78fcc427776920480c6c0e780