0

我在玩理性,我想尝试做 FFIdebug来学习。我有这个代码

module Instance = {
  type t;
  external t : t = "" [@@bs.module];
};

module Debug = {
  type t;
  external createDebug : string => Instance.t = "debug" [@@bs.module];
};

我正在尝试像这样使用它

open Debug;    
let instance = Debug.createDebug "app";
instance "Hello World !!!";

但我收到以下错误

Error: This expression has type Debug.Instance.t
       This is not a function; it cannot be applied.

instance应该绑定到函数吗?我也试过

module Instance = {
  type t;
  external write : string => unit = "" [@@bs.send];
};

open Debug;    
let instance = Debug.createDebug "app";    
instance.write "Hello World !!!";

但我明白了

Error: Unbound record field write

我错过了什么?

4

1 回答 1

1

createDebug根据您的声明,该函数返回 type 的值Instance.t。它是一个抽象值,从某种意义上说,它的实现一无所知,你只能通过它的接口使用它。基本上,类型的接口是允许您操作此类型值的所有值(函数)。在您的情况下,我们只能找到两个这样的值 -Instance.t值和Debug.createDebug函数。根据您自己的声明,两者都可以用来创造这样的价值。没有提供使用它的功能。

可能您对什么是模块有一些误解。它本身不是一个对象,而是一个命名空间。它就像文件中的文件。

您的第二个示例证明您正在考虑模块,因为它们是一种运行时对象或记录。但是,它们只是静态结构,用于将大型程序组织到分层命名空间中。

您尝试使用的实际上是一条记录:

type debug = { write : string => unit }

let create_debug service => {
  write: fun msg => print_endline (service ^ ": " ^ msg)
}

let debug = create_debug "server"
debug.write "started"

将产生:

server: started
于 2017-07-12T13:01:14.593 回答