1

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

type a_type
type b_type

let a : a_type = (* ? *)

我在阅读BuckleScript FFI 手册时遇到了这个问题。绑定到 JS 对象的代码如下所示:

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

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

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

4

1 回答 1

2

它被称为抽象类型,通常用于隐藏底层数据的结构,但在 BuckleScript 中特别有用,因为底层 JavaScript 结构甚至不一定可以表示为原生 OCaml 类型。

然而,它不是多态的,只是一种不透明的类型。

不过,FFI 的性质可能会使这个概念有点复杂。外来“函数”根据定义是无类型的,使用externals 定义 FFI 的过程是告诉编译器这些函数的类型是什么。因此,您可以告诉编译器,如果您愿意,它会toString返回 an int,并且在您实际尝试将其用作 an 之前,它不会知道区别int,这当然会以糟糕的方式结束。

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

于 2017-10-20T19:24:56.583 回答