2017-10-20 37 views
1

。 JSオブジェクトに結合するためのコードは次のようになります。空の型宣言

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

BuckleScriptの特異性はさておき、tはそれが一般的な外部JSの種類の多形型の機能を果たすているように、この場合に見えます有効なタイプとして使用されています。

私はこのような基本的な質問をすることについて謝罪する必要がありますが、これは私が調べたところではどこにも記載されていません。任意のポインタが評価されます。

答えて

2

abstract typeと呼ばれ、通常、基礎となるデータの構造を隠すために使用されますが、基本的なJavaScript構造が必ずしもネイティブOCamlタイプとして表現できないため、BuckleScriptでは特に便利です。

多型ではありませんが、不透明なタイプです。

FFIの性質は、概念を少し複雑にするかもしれません。外部の "関数"は定義によって型定義されておらず、externalを使用してFFIを定義するプロセスは、これらの関数のタイプをコンパイラに指示するものです。したがって、toStringintを返すことをコンパイラに伝えることができます。実際にはintとして使用しようとするまで、その違いはわかりません。

しかし、抽象型はユーザー定義であり、構造体を持たないため、FFIを使用して抽象型を操作できるすべての関数を自分で定義する必要があります。 OCamlでは(少なくともタイプシステムを迂回しない限り)OCamlを操作することはできません。したがって、1つのFFI関数から別のFFI関数に値を渡せるブラックボックスだけです。

+0

これは基本的にJsタイプを抽象化したものです(Jsオブジェクトは動的なので)。 – PieOhPah

+0

通常、任意のタイプにすることができます。 'Js.Json.t'は任意のJson型であることができますが、抽象型は' JSONにバインドするときのように、わからない(または知りたくない)ときに便利です。解析する。また、[DOM](https://github.com/BuckleScript/bucklescript/blob/master/jscomp/others/dom.mli)のタイプ階層を定義するなど、もっと奇妙なことを行うこともできます。 – glennsl