不使用库的ocaml中的列表联合

时间:2015-03-14 05:15:40

标签: ocaml

我有一项任务,需要在不使用任何库函数的情况下将代码写入联合列表 这是我的代码

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'中

有人可以帮我找出我做错的地方吗?感谢

1 个答案:

答案 0 :(得分:3)

我认为你在最后一行只需要一些括号:

if f hd l1 then union (hd::l1) tl else union l1 tl

在OCaml函数中,应用程序(如f x中)具有非常高的优先级。因此,如果没有这些表示,表达式将被解释为(union hd) :: (l1 tl)

(这段代码非常好。可能会将f重命名为更具描述性的内容,例如notmem