2014-11-08 32 views
2

假設我有一些接口文件mylib.mli如何從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作爲存根的採集自動化的方式? (通過「存根」我的意思是「最小的,接口實現功能」)。

回答

4

AFAIK,目前沒有這樣的工具編寫。也許,因爲手動完成這件事並不是一件大事。寫存根最簡單的方法是:

let foo = failwith "not implemented" 

或者你可以使其在下面的方式

let stub _ = failwith "unimplemented" 

let foo = stub 
let bar = stub 
... 
1

對於它的價值,編譯器的-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的背景下一些有趣的討論:

Given a Haskell type signature, is it possible to generate the code automatically?

+0

是的,但良好的做法是從'* .mli'啓動。更好的建議是使用'corebuild stubs.inferred.mli',imho。 – ivg 2014-11-08 19:49:50