我有一项任务,需要在不使用任何库函数的情况下将代码写入联合列表 这是我的代码
let rec union (l1:'a list) (l2:'a list) =
let rec f x l = match l with
| [] -> true
| hd::tl ->
if x = hd then false else f x tl
in
match l2 with
| [] -> l1
| hd::tl ->
if f hd l1 then
union hd::l1 tl
else
union l1 tl
但是编译器说“这个表达式有'a'但是表达式是'a list'类型变量'a'出现在'list'中
有人可以帮我找出我做错的地方吗?感谢
答案 0 :(得分:3)
我认为你在最后一行只需要一些括号:
if f hd l1 then union (hd::l1) tl else union l1 tl
在OCaml函数中,应用程序(如f x
中)具有非常高的优先级。因此,如果没有这些表示,表达式将被解释为(union hd) :: (l1 tl)
。
(这段代码非常好。可能会将f
重命名为更具描述性的内容,例如notmem
。