空类型声明
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" 根据定义是无类型的,使用 external
s 定义 FFI 的过程就是告诉编译器这些函数的类型。所以你可以告诉编译器 toString
returns 一个 int
如果你愿意,它不会知道区别,直到你真正尝试将它用作 int
,这当然会很糟糕。
但是由于抽象类型是用户定义的并且没有结构,您必须通过 FFI 自己定义所有可以对其进行操作的函数。你不能在 OCaml 中操作它(除非你至少绕过类型系统),所以它只是一个黑盒子,使你能够将值从一个 FFI 函数传递到另一个。
当一个人声明一个类型而不将它绑定到任何东西时会发生什么:
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" 根据定义是无类型的,使用 external
s 定义 FFI 的过程就是告诉编译器这些函数的类型。所以你可以告诉编译器 toString
returns 一个 int
如果你愿意,它不会知道区别,直到你真正尝试将它用作 int
,这当然会很糟糕。
但是由于抽象类型是用户定义的并且没有结构,您必须通过 FFI 自己定义所有可以对其进行操作的函数。你不能在 OCaml 中操作它(除非你至少绕过类型系统),所以它只是一个黑盒子,使你能够将值从一个 FFI 函数传递到另一个。