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

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

27 Внешние типы

(Появилось в OCaml 5.5)

Внешние типы вводят типы значений, определённых вне языка OCaml (их нельзя определить как стандартный тип данных или получить, комбинируя существующие конструкторы типов), поскольку такие значения поступают через интерфейс вызова внешних функций. Например, тип gmp для целых чисел произвольной длины, реализованный посредством привязки библиотеки Gmp из C, можно определить следующим образом:

module Gmp : sig
  type t = external "gmp"

  val of_int : int -> t
  val add : t -> t -> t
  (* ... *)
end = …

Мы говорим, что Gmp.t — это внешний тип с именем gmp. Имена внешних типов не уникальны: можно определить два (различных) внешних типа с одним и тем же именем. С другой стороны, система типов гарантирует, что два внешних типа с разными именами различаются.

До появления внешних типов пользователи могли использовать для этой цели абстрактный тип, просто написав type gmp. Однако это менее информативно, поскольку компилятор OCaml должен предполагать, что абстрактные типы могут быть определены произвольным образом; в частности, абстрактный тип из другого модуля может совпадать с любым типом.

Предопределённые типы

Внешние типы можно использовать, в частности, для определения встроенных типов, таких как float, string и т. д.

type float = external "float"
type string = external "string"
type 'a array = external "array"
type +'a iarray = external "iarray"
(* ... *)

Например, мы знаем, что float и string — разные типы, поскольку у них разные имена.

Замечание: это особенно полезно при использовании предопределённых типов в качестве индексов GADT: несовместимые конструкторы можно исключить. Обсуждение индексов GADT см. в разделе 7.8.

Вариантность и инъективность

Как и для абстрактных типов, вариантность параметров внешних типов должна быть указана пользователями; по умолчанию предполагается инвариантность. В отличие от абстрактных типов, внешние типы всегда инъективны.

« Именованные кортежиРасширения языка
Авторское право © 2026 Institut National de Recherche en Informatique et en Automatique

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/externaltypes.html

Spec-Zone.ru

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