OCaml插件的任意类型接口

OCaml插件的任意类型接口,ocaml,ocamlbuild,Ocaml,Ocamlbuild,我正在使用编写计算器,它能够在运行时计算OCaml表达式 这是我的插件接口 open Ocaml_plugin.Std module type S = sig val f : unit -> float end let univ_constr : (module S) Ocaml_dynloader.Univ_constr.t = Ocaml_dynloader.Univ_constr.create () 我能够加载带有签名单元->浮点的函数,例如 let f () = 3.

我正在使用编写计算器,它能够在运行时计算OCaml表达式

这是我的插件接口

open Ocaml_plugin.Std

module type S = sig
  val f : unit -> float
end

let univ_constr : (module S) Ocaml_dynloader.Univ_constr.t =
  Ocaml_dynloader.Univ_constr.create ()
我能够加载带有签名
单元->浮点的函数,例如

let f () = 3.14159
let f () = 1.5 *. 1.5 *. 3.
并在主程序中调用f()来计算函数体中的表达式。但是,它仅支持浮点类型

如果我希望它支持int,我应该怎么做?时间,t?或者任何任意的OCaml类型

let f () = List.length [1;2;3]  (* int *)
let f () = Time.now ()          (* Time.t *)
let f () = "hello world!!!"     (* string *)
为了在运行时进行评估,ocaml_插件似乎是唯一的选择。但是,为了让加载程序/编译器知道动态加载的是什么,我必须编写一个接口。我应该如何更改接口文件以使其支持其他类型?

GADT(广义代数数据类型)来拯救

虽然GADT存在很长时间,但它在OCaml中是一个相对较新的主题。它有助于在OCaml中安全地编写泛型库

module Value = struct
   type 'a t

   module Packed = struct
     type 'a unpacked = 'a t
     type t = T : 'a unpacked -> t
   end

end

t是我们想要的压缩数据类型。理论上,任何数据类型都可以打包。

为什么是任意类型?主程序中的
f
肯定有一个预期的结果类型?计算器希望显示计算结果。pervasive中的所有类型都可以作为字符串打印出来。GADT可能是添加对一些类型的支持的一种方法。