2017-10-20 296 views
1

当一个声明了一个类型不绑定到任何东西会发生什么:空类型声明

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型。

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

回答

2

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

它不是多态,但只是一个不透明的类型。但是,FFI的本质可能会使这个概念复杂化一些。外来“函数”根据定义是无类型的,使用external定义FFI的过程就是告诉编译器这些函数的类型。所以,你可以告诉你,如果想要的toString返回int编译器,它不会知道其中的差别,直到你真正尝试使用它作为一个int,这当然会结束得厉害。

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

+0

所以它基本上抽象了Js类型(因为Js对象是动态的)。 – PieOhPah

+0

通常,但它可以是任何类型。 'Js.Json.t'例如可以是任何的Json类型,但是当我们还不知道(或不想知道)抽象类型是非常有用的,就像你从绑定到'JSON得到什么。 parse'。你还可以做很多疯狂的事情,比如定义[DOM]的类型层次(https://github.com/BuckleScript/bucklescript/blob/master/jscomp/others/dom.mli) – glennsl