Functional programming 删除重复字符串和空字符串

Functional programming 删除重复字符串和空字符串,functional-programming,ocaml,Functional Programming,Ocaml,我有一个列表,我想写一个函数,返回一个没有重复和空字符串列表的列表。例如,上面的undefined列表将返回: let undefined = ["string"; ""; "string"; "boolean";"";"innermost"] 我写这个函数,它返回给我没有重复,但我如何添加测试空字符串的条件 ["string"; "boolean"; "innermost"] 让rec uniquify=函数 | [] -> [] |x::xs->x::uniquify(List.filt

我有一个列表,我想写一个函数,返回一个没有重复和空字符串列表的列表。例如,上面的
undefined
列表将返回:

let undefined = ["string"; ""; "string"; "boolean";"";"innermost"]
我写这个函数,它返回给我没有重复,但我如何添加测试空字符串的条件

["string"; "boolean"; "innermost"]
让rec uniquify=函数
| [] -> []
|x::xs->x::uniquify(List.filter(()x)xs)

非常感谢

只需将结果导入
List.filter(fun s->s“”)
即可删除空字符串。这是一种简单的合成方式,你也可以修改你的函数,让它安静地删除

let rec uniquify = function
| [] -> []
| x::xs -> x :: uniquify (List.filter ((<>) x) xs)

可以使用一组已看到的字符串:

let do_stuff list =
  let open Batteries in
  List.remove (List.sort_unique String.compare list) ""
第一行定义字符串集的类型

然后,uniquify调用一个辅助函数,向列表和集合中添加一个从未见过的字符串,或者丢弃该字符串。
acc
用于使迭代尾部递归(从而避免长列表上的堆栈溢出)


使用此方案更好,因为复杂性是O(N.log N)而不是N²。

@Febrice Le Fessant我尝试了您的代码,在第8行(iter的set tail),编译器给了我以下错误:错误:“此表达式的类型为StringSet.elt=string,但表达式的类型应为'a list'。第8行有一个小错误,iter的第一个参数是字符串列表,而不仅仅是字符串。我刚试过,现在很好用。
let do_stuff list =
  let open Batteries in
  List.remove (List.sort_unique String.compare list) ""
module StringSet = Set.Make(String)
let uniquify list =
  let rec iter acc set list =
    match list with
     | [] -> List.rev acc
     | s :: tail ->
       if StringSet.mem s set then
          iter acc set tail
       else
          iter (s :: acc) (StringSet.add s set) tail
  in
  iter [] StringSet.empty list