2017-10-20 32 views
1

Qu'est-ce qui se passe quand on déclare un type sans se lier à quoi que ce soit:vide Type

type a_type 
type b_type 

let a : a_type = (* ? *) 

je suis tombé sur ce tout en lisant BuckleScript FFI manual. Le code pour la liaison à un objet JS ressemble à ceci:

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

spécificités de BuckleScript côté, t est utilisé comme un type valide, qui dans ce cas ressemble à cela agit comme un type polymorphes pour un type de JS externe générique.

Je dois m'excuser d'avoir posé une question aussi rudimentaire, mais cela n'est documenté nulle part. Tous les pointeurs sont appréciés.

Répondre

2

Appelée abstract type, elle est généralement utilisée pour masquer la structure des données sous-jacentes, mais est particulièrement utile avec BuckleScript, car la structure JavaScript sous-jacente n'est pas nécessairement représentable en tant que type OCaml natif.

Il n'est cependant pas polymorphe, mais seulement un type opaque.

La nature de FFI pourrait cependant compliquer un peu le concept. Les "fonctions" étrangères sont par définition non typées, et le processus de définition d'un FFI utilisant external s est celui où vous dites au compilateur quels sont les types de ces fonctions. Donc, vous pouvez dire au compilateur que toString retourne un int si vous voulez, et il ne connaîtra pas la différence jusqu'à ce que vous essayiez réellement de l'utiliser comme int, ce qui finira bien sûr mal.

Mais comme les types abstraits sont définis par l'utilisateur et n'ont pas de structure, vous devrez définir vous-même toutes les fonctions qui peuvent fonctionner sur le FFI. Vous ne pouvez pas le manipuler dans OCaml (à moins de contourner au moins le système de types), donc c'est juste une boîte noire qui vous permet de transporter une valeur d'une fonction FFI à une autre.

+0

Donc c'est essentiellement abstrait le type Js (puisque les objets Js sont dynamiques). – PieOhPah

+0

Habituellement, mais cela peut être n'importe quel type. 'Js.Json.t' par exemple peut être n'importe quel type Json, mais le type abstrait est utile quand on ne sait pas encore (ou ne veut pas savoir), comme ce que l'on obtiendrait en se liant à' JSON. analyser. Vous pouvez aussi faire des choses beaucoup plus folles, comme définir la hiérarchie des types de [DOM] (https://github.com/BuckleScript/bucklescript/blob/master/jscomp/others/dom.mli) – glennsl