Types 空类型声明

Types 空类型声明,types,ocaml,ffi,abstract-data-type,bucklescript,Types,Ocaml,Ffi,Abstract Data Type,Bucklescript,当声明类型而不将其绑定到任何对象时会发生什么情况: type a_type type b_type let a : a_type = (* ? *) 我在看书的时候碰到了这个。绑定到JS对象的代码如下所示: type t external create_date : unit -> t = "Date" [@@bs.new] let date = create_date () 撇开BuckleScript的特殊性不谈,t被用作有效类型,在本例中,它看起来像是通用外部JS类型的多态类型

当声明类型而不将其绑定到任何对象时会发生什么情况:

type a_type
type b_type

let a : a_type = (* ? *)
我在看书的时候碰到了这个。绑定到JS对象的代码如下所示:

type t
external create_date : unit -> t = "Date" [@@bs.new]
let date = create_date ()
撇开BuckleScript的特殊性不谈,
t
被用作有效类型,在本例中,它看起来像是通用外部JS类型的多态类型

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

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

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

不过,外国金融机构的性质可能会使这个概念有点复杂。根据定义,外部“函数”是非类型化的,使用
external
s定义FFI的过程就是告诉编译器这些函数的类型的过程。因此,如果需要,您可以告诉编译器,
toString
返回一个
int
,直到您实际尝试将其用作
int
,它才会知道这两者之间的区别,这当然会导致糟糕的结果


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

因此它基本上是抽象Js类型(因为Js对象是动态的)。通常,但它可以是任何类型<例如,code>Js.Json.t可以是任何Json类型,但当我们还不知道(或不想知道)时,抽象类型很有用,就像绑定到
Json.parse
时一样。您还可以做更疯狂的事情,比如定义