2017-10-20 295 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