代码之家  ›  专栏  ›  技术社区  ›  Pandemonium

空类型声明

  •  1
  • Pandemonium  · 技术社区  · 8 年前

    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 回复  |  直到 8 年前
        1
  •  2
  •   glennsl Namudon'tdie    8 年前

    这叫做 abstract type ,通常用于隐藏底层数据的结构,但对于BuckleScript特别有用,因为底层JavaScript结构甚至不一定可以表示为本机OCaml类型。

    不过,外国金融机构的性质可能会使这个概念有点复杂。根据定义,外国“功能”是非类型的,定义外国金融机构的过程使用 external 是告诉编译器这些函数的类型。所以你可以告诉编译器 toString 返回一个 int 如果你愿意,它不会知道区别,直到你真正尝试使用它作为一个 整数 这当然会有糟糕的结局。

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