Spec-Zone.ru › OCaml
☰Язык программирования OCaml
  • Язык программирования OCaml
  • Расширения языка

Глава 12 Расширения языка

22 Обобщённые операторы open

(Введены в версии 4.08)

определение ::= ...
∣ open выражение-модуля
∣ open! выражение-модуля
спецификация ::= ...
∣ open расширенный-путь-к-модулю
∣ open! расширенный-путь-к-модулю
выражение ::= ...
∣ let open выражение-модуля in выражение
∣ let open! выражение-модуля in выражение

Это расширение позволяет открывать любое выражение модуля в структурах и выражениях модулей. Аналогичный механизм также доступен внутри типов модулей, но только для расширенных путей к модулям (например, F(X).G(Y)).

Например, модуль может быть ограничен при открытии с помощью

module M = struct let x = 0 let hidden = 1 end
open (M:sig val x: int end)
let y = hidden

Error: Unbound value hidden

Ещё один вариант — немедленно открыть результат применения функтора

  let sort (type x) (x:x list) =
    let open Set.Make(struct type t = x let compare=compare end) in
    elements (of_list x)

val sort : 'x list -> 'x list = 

Кроме того, эта конструкция может вводить локальные компоненты внутри структуры,

module M = struct
  let x = 0
  open! struct
    let x = 0
    let y = 1
  end
  let w = x + y
end

module M : sig val x : int val w : int end

Важное ограничение состоит в том, что типы, введённые с помощью open struct ... end, не могут появляться в сигнатуре окружающей структуры, если только они не определены как равные какому-либо нелокальному типу. Таким образом:

module M = struct
  open struct type 'a t = 'a option = None | Some of 'a end
  let x : int t = Some 1
end

module M : sig val x : int option end

в порядке, но:

module M = struct
  open struct type t = A end
  let x = A
end

Error: The type t introduced by this open appears in the signature.
  The value x has no valid type if t is hidden.

не в порядке, потому что x не может получить какой-либо тип, кроме t, который существует только локально. Хотя вышеуказанное было бы в порядке, если бы x тоже было локальным:

module M: sig end = struct
  open struct
  type t = A
  end
  …
  open struct let x = A end
  …
end

module M : sig end

В сигнатурах расширенные операторы open ограничены расширенными путями к модулям,

module type S = sig
  module F: sig end -> sig type t end
  module X: sig end
  open F(X)
  val f: t
end

module type S =
  sig
    module F : sig end -> sig type t end
    module X : sig end
    val f : F(X).t
  end

а не

  open struct type t = int end

В этих ситуациях вместо этого можно использовать локальные подстановки (см. 12.7.2).

Обратите внимание, что это расширение недоступно внутри определений классов:

class c =
  let open Set.Make(Int) in
  ...
« ПредупрежденияОператоры связывания »
Авторское право © 2024 Institut National de Recherche en Informatique et en Automatique

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/generalizedopens.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API