小编sor*_*rry的帖子

OCaml接口与签名?

我对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 module structure interface signature

12
推荐指数
1
解决办法
5139
查看次数

OCaml合并排序错误?

我正在学习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中编码对我来说是一个令人沮丧的新体验.

syntax mergesort ocaml

2
推荐指数
1
解决办法
528
查看次数

标签 统计

ocaml ×2

interface ×1

mergesort ×1

module ×1

signature ×1

structure ×1

syntax ×1