设置符号OCaml

时间:2013-02-04 03:14:31

标签: ocaml

这只是关于OCaml中符号的问题。

我正在尝试测试功能

let rec add (x : 'a) (l : 'a set) : bool =
begin match l with
| [] -> []
| hd :: rest -> if x = hd then rest else (hd :: (add x rest))
end

我的测试用例是

let test () : bool =
add (3 [1; 2; 4]) = [1; 2; 3; 4]
;; run_test "add 3 [1; 2; 4]" test

我得到一个“这个表达式不是函数,不能应用”错误

我的记谱法有问题吗?

2 个答案:

答案 0 :(得分:3)

OCaml没有内置的集合类型(而是有一个Set模块或库)。因此,对于集合常量,也没有内置的表示法。

对于小型集合,通常使用列表。事实上,List.mem是一个在列表(不是集合)上运行的函数。列表的表示法如下:[1; 2; 3; 4]

(作为旁注,你的名为add的函数不会添加任何内容。但也许你刚刚开始。)

答案 1 :(得分:2)

OCaml中没有设置符号。我不知道您的'a set类型是什么,我不明白为什么会员资格会使用List.mem进行测试,但它没有特定的符号。

标准库中有一个Set.Make仿函数,由一个至少具有键和{(3}})类型和比较函数的模块实例化:

module StringSet = Set.Make(String)
let set = StringSet.(add 0 (add 1 (add 2 empty)))
let test = StringSet.mem 3 set

如果您想要一个方便的表示法,最好的办法是使用从列表到集合的转换函数,并使用列表表示法:

let set_of_list li = List.fold_left (fun s v -> StringSet.add v s) StringSet.empty li
let set = set_of_list [0; 1; 2]