在OCaml中的列表中查找唯一元素

时间:2012-03-26 20:26:43

标签: list functional-programming ocaml

我正在使用OCaml开发一个项目,并且我对数组有一些问题,我不确定。我不被允许使用List模块,所以请给我一些关于我的作品的想法或建议。

首先,我已经实现了一个名为'a list -> 'a list的函数uniq,它返回数组中uniq元素的列表,例如uniq [5;6;5;4] => [6;5;4]

这是我的实施:

let rec uniq x =
let rec uniq_help l n = 
    match l with
        [] -> []
    |   h :: t -> uniq_help t, n if (n = h) else (h :: (uniq_help(t, n)))
match x with
    [] -> []
|   h::t -> uniq_help t, h
;;

我确信这是一个正确的实施,有人可以给我一些建议或正确吗?

1 个答案:

答案 0 :(得分:8)

由于各种原因,您的函数在语法上是不正确的:

  • uniq_help需要两个元素,因此您必须使用uniq_help t n调用它,而不是uniq_help(t, n)等。
  • if/else表达式的格式应为if cond then expr1 else expr2
  • 要在uniq_help本地使用uniq,您需要in个关键字。

修复语法错误后,您的函数如下所示:

let rec uniq x =
  let rec uniq_help l n = 
    match l with
    | [] -> []
    | h :: t -> if n = h then uniq_help t n else h::(uniq_help t n) in
  match x with
  | [] -> []
  | h::t -> uniq_help t h

但是,为了确保列表中的每个元素都是唯一的,您必须检查其所有元素的唯一性。一个快速解决方案可能是:

let rec uniq x =
     (* uniq_help is the same as above *)
     match x with
     | [] -> []
     | h::t -> h::(uniq_help (uniq t) h)