空类型声明

时间:2017-10-20 19:18:06

标签: types ocaml ffi abstract-data-type bucklescript

当一个人声明一个没有将它绑定到任何东西的类型时会发生什么:

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类型的多态类型。

我不得不就提出这样一些基本问题而道歉,但在我调查的任何地方都没有记录。任何指针都表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

然而,它不是多态的,只是一种不透明的类型。

但是,FFI的性质可能会使概念复杂化。根据定义,外部“函数”是无类型的,使用express定义FFI的过程是告诉编译器这些函数的类型是什么的过程。所以你可以告诉编译器var express = require('express'), app = express()如果你想要的话会返回一个external,并且在你真正尝试将它用作toString之前它不会知道区别,当然结局很糟糕。

但是由于抽象类型是用户定义的并且没有结构,因此您必须通过FFI自定义可以对其进行操作的所有函数。你无法在OCaml中操作它(除非你至少绕过类型系统),所以它只是一个黑盒子,它允许你从一个FFI函数传递一个值到另一个。