我对OCaml中的接口与签名有点困惑.根据我的阅读,接口(.mli文件)管理其他程序可以使用/调用的值.签名文件看起来完全相同,除了它们命名,因此您可以创建不同的接口实现.例如,如果我想创建一个类似于Java中的集合的模块:
我有这样的事情:
set.mli文件:
type 'a set
val is_empty : 'a set -> bool
val ....
etc.
Run Code Online (Sandbox Code Playgroud)
签名文件(setType.ml)
module type Set = sig
type 'a set
val is_empty : 'a set -> bool
val ...
etc.
end
Run Code Online (Sandbox Code Playgroud)
然后一个实现将是另一个.ml文件,例如SpecialSet.ml,它包含一个定义所有值及其作用的结构.
module SpecialSet : Set
struct
...
Run Code Online (Sandbox Code Playgroud)
关于"签名"究竟是什么以及它的用途是什么,我有点困惑.它不是一种界面吗?为什么需要.mli和.ml?我看到的行的唯一区别是它命名模块.
我误解了这个,还是还有其他事情发生在这里?
我正在学习OCaml,它给了我一些问题.我正在尝试实现merge_sort函数,但它在给定代码的第5行上不断给出错误.我只是完全混淆为什么它给我错误,如果有人能启发我,我会非常感激.我甚至不确定我是否正确设置模式匹配(匹配语句),所以如果你能看一下,那真的很有帮助.
let rec merge_sorted (l1:int list) (l2:int list) : int list =
let end_list = [] in
begin match l1, l2 with
| [], [] -> end_list
| h1::t1, h2::t2 -> if h1 < h2 then merge_sorted t1 t2 (h1 :: end_list) else merge_sorted t1 t2 h2::end_list, h1::end_list
end
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
错误:此函数适用于太多参数,也许您忘记了一个`;' merge_sorted:int list - > int list - > int list
在它说"如果h1 <h2然后merge_sorted t1 t2 ......"的部分
我还想知道是否有学习OCaml语法的地方?我一直在尝试使用Jason Hickey的书,但有些事情并没有深入探讨(例如这种多重/并行模式匹配).我只用Java编写,所以在OCaml中编码对我来说是一个令人沮丧的新体验.