当一个人声明一个没有将它绑定到任何东西的类型时会发生什么:
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类型的多态类型。
我不得不就提出这样一些基本问题而道歉,但在我调查的任何地方都没有记录。任何指针都表示赞赏。
答案 0 :(得分:2)
它被称为abstract type,通常用于隐藏底层数据的结构,但对BuckleScript特别有用,因为底层JavaScript结构不一定能代表本机OCaml类型。
然而,它不是多态的,只是一种不透明的类型。
但是,FFI的性质可能会使概念复杂化。根据定义,外部“函数”是无类型的,使用express
定义FFI的过程是告诉编译器这些函数的类型是什么的过程。所以你可以告诉编译器var express = require('express'),
app = express()
如果你想要的话会返回一个external
,并且在你真正尝试将它用作toString
之前它不会知道区别,当然结局很糟糕。
但是由于抽象类型是用户定义的并且没有结构,因此您必须通过FFI自定义可以对其进行操作的所有函数。你无法在OCaml中操作它(除非你至少绕过类型系统),所以它只是一个黑盒子,它允许你从一个FFI函数传递一个值到另一个。