这只是关于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
我得到一个“这个表达式不是函数,不能应用”错误
我的记谱法有问题吗?
答案 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]