没有声明的类型是什么意思?

what does a type without a declaration mean?

在 OCaml 中,以下代码的实际作用是什么?

module T = struct
  type t
end

似乎没有办法构造这样一个类型t,因为它没有完全定义,但它确实可以编译。

我认为它的一种用途是用于 FFI,其中 t 在编译时链接到其他东西,但我不确定。

这定义了一个抽象类型。这个定义没有理由不编译。事实上这样的定义

type t

不向用户提供任何方式来创建或使用 t 类型的值 (不使用外部设备)与更标准的

相比
module M: sig
  type t
  val create: unit -> t
  val consume: t -> unit
end = struct
  ...
end

是模块编写者关心的问题,而不是编译器。 而且,这种抽象类型在写绑定的时候可以派上用场:

type t
external create: unit -> t = "c_binding_to_create"

或作为幻像类型中的 type-level 标签

type meter
type second
module Unit : sig
  type 'a t
  val m: meter t
  val s: second t
  val ( * ): 'a t -> 'b t -> ('a*'b) t
  val ( + ): 'a t -> 'a t -> 'a t
end = struct
  type 'a t = float
  let m = 1.
  let s = 1.
  let ( * ) = ( *. )
  let ( + ) = ( +. )
end

但是请注意,对于这种用例,类型检查器无法证明抽象类型之间的不等式,这使得它们不适合与 GADT 结合使用,最好将上述类型定义为

type meter = private Meter_tag
type second = private Second_tag

这使得写

成为可能
type ('a,'b) eq = Refl: ('a,'a) eq
let absurd (x: (meter,second) eq) = match x with _ -> .