1

这只是一个关于 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

我收到“此表达式不是函数,无法应用”错误

我的符号有问题吗?

4

2 回答 2

3

OCaml 没有内置的集合类型(而是有一个 Set 模块或库)。因此,设置常量也没有内置符号。

对于较小的集合,通常使用列表。而且,事实上,List.mem它是一个对列表(而不是集合)进行操作的函数。列表的符号是这样的:[1; 2; 3; 4].

(作为旁注,您命名的函数add没有添加任何内容。但也许您才刚刚开始。)

于 2013-02-04T03:34:49.947 回答
2

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

标准库中有一个Set.Make 仿函数,由一个模块实例化,该模块至少有一个类型和一个键上的比较函数(见这里):

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]
于 2013-02-04T03:40:36.393 回答