2017-10-20 10 views
1

Was passiert, wenn man eine Art erklärt es alles ohne Bindung:Leere Typ Erklärung

type a_type 
type b_type 

let a : a_type = (* ? *) 

ich in diese während lief BuckleScript FFI manual zu lesen. Der Code für zu einem JS Objekt Bindung sieht wie folgt aus:

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

BuckleScript die Besonderheiten abgesehen, ist t als gültige Art verwendet, die in diesem Fall sieht aus wie es ist als polymorpher Typ für eine generische externe JS-Typ handeln.

Ich habe zu fragen, so rudimentär Frage zu entschuldigen, aber dies ist nicht dokumentiert überall habe ich sehe in. Irgendwelche Hinweise werden geschätzt.

Antwort

2

Es heißt abstract type und wird normalerweise verwendet, um die Struktur der zugrunde liegenden Daten zu verbergen, ist aber besonders nützlich mit BuckleScript, da die zugrunde liegende JavaScript-Struktur nicht unbedingt als nativer OCaml-Typ dargestellt werden kann.

Es ist nicht polymorph jedoch nur eine undurchsichtige Art.

Die Art der FFI könnte das Konzept ein wenig, obwohl erschweren. Ausländische "Funktionen" sind per Definition nicht typisiert und der Prozess zum Definieren eines FFI unter Verwendung von external s ist einer, bei dem Sie dem Compiler mitteilen, welche Arten dieser Funktionen vorhanden sind. So könnte man den Compiler sagen, dass toString eine int zurückgibt, wenn Sie wollen, und es wird den Unterschied nicht wissen, bis Sie tatsächlich versuchen, es zu benutzen als int, die schlecht natürlich enden wird.

Aber da abstrakte Typen sind benutzerdefiniert und haben keine Struktur Sie alle Funktionen definieren, die sich auf sie arbeiten kann, über den FFI. Sie können es in OCaml nicht manipulieren (es sei denn, Sie umgehen das Typsystem zumindest), also ist es nur eine Blackbox, die es Ihnen ermöglicht, einen Wert von einer FFI-Funktion zu einer anderen zu übertragen.

+0

es ist also im Grunde abstrakt der Js-Typ (da Js Objekte dynamisch sind). – PieOhPah

+0

Normalerweise, aber es kann jeder Typ sein. 'Js.Json.t' zum Beispiel kann ein beliebiger Json-Typ sein, aber der abstrakte Typ ist nützlich, wenn wir noch nicht wissen (oder nicht wissen wollen), wie das, was Sie von der Bindung an' JSON bekommen würden. analysieren. Sie können auch verrücktere Dinge tun, wie zum Beispiel die Typhierarchie des [DOM] definieren (https://github.com/BuckleScript/bucklescript/blob/master/jscomp/others/dom.mli) – glennsl

Verwandte Themen