没有声明的类型是什么意思?
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 _ -> .
在 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 _ -> .