空类型声明

Empty Type Declaration

当一个人声明一个类型而不将它绑定到任何东西时会发生什么:

type a_type
type b_type

let a : a_type = (* ? *)

我在阅读 BuckleScript FFI manual 时 运行 进入了这个。绑定到 JS 对象的代码如下所示:

type t
external create_date : unit -> t = "Date" [@@bs.new]
let date = create_date ()

撇开 BuckleScript 的特殊性不谈,t 被用作有效类型,在这种情况下它看起来像是作为通用外部 JS 类型的多态类型。

我不得不为提出这样的基本问题而道歉,但在我调查过的任何地方都没有记录。感谢任何指点。

它被称为 abstract type,通常用于隐藏底层数据的结构,但对于 BuckleScript 特别有用,因为底层 JavaScript 结构甚至不一定可以表示为本机 OCaml 类型。

它不是多态的,只是一个不透明的类型。

不过,FFI 的性质可能会使这个概念变得有点复杂。 Foreign "functions" 根据定义是无类型的,使用 externals 定义 FFI 的过程就是告诉编译器这些函数的类型。所以你可以告诉编译器 toString returns 一个 int 如果你愿意,它不会知道区别,直到你真正尝试将它用作 int,这当然会很糟糕。

但是由于抽象类型是用户定义的并且没有结构,您必须通过 FFI 自己定义所有可以对其进行操作的函数。你不能在 OCaml 中操作它(除非你至少绕过类型系统),所以它只是一个黑盒子,使你能够将值从一个 FFI 函数传递到另一个。