如何从mli文件自动生成存根



假设我有一些类似的接口文件mylib.mli

var foo      : 'a list -> int
val bar      : f:('a -> 'b) -> 'a list -> 'b list
val baz      : f:('a -> bool) -> 'a list -> 'a list
val frobnitz : init:'acc -> f:('acc -> 'a -> 'acc) -> 'a list -> 'acc
val frobozz  : 'a list -> 'a list -> 'a list
val quux     : 'a list list -> 'a list

是否有一种自动的方法将相应的mylib.ml生成为存根的集合?(我所说的"存根"是指"最小的接口实现功能"。)

AFAIK,目前还没有编写这样的工具。也许吧,因为手动操作并不是一件大事。写存根最简单的方法是:

let foo = failwith "not implemented"

或者你可以通过以下方式进行

let stub _ = failwith "unimplemented"
let foo = stub
let bar = stub
...

值得注意的是,编译器的-i标志会向另一个方向转换。

$ cat stubs.ml
let foo (x: 'a list) = 3
let bar ~f: f l = List.map f l
let baz ~f: p l = List.filter p l
$ ocamlc -i stubs.ml
val foo : 'a list -> int
val bar : f:('a -> 'b) -> 'a list -> 'b list
val baz : f:('a -> bool) -> 'a list -> 'a list

更新

以下是在Haskell:的背景下进行的一些有趣的讨论

给定Haskell类型的签名,是否可以自动生成代码?

最新更新