使用fold_left在OCaml中搜索元素

时间:2012-05-02 12:38:05

标签: list ocaml

我想知道如何在Ocaml中构建一个函数,使用List.fold_left来查明列表中是否存在元素。 例如:

exists 3 [1;2;3;4;5] 
=> true

此功能的类型为:a -> bool -> 'a list -> bool

我的想法如何做到如下:

let exists k l = List.fold_left( fun a x-> a=x) k l

但显然是错的。有什么建议吗?

3 个答案:

答案 0 :(得分:6)

let exists k l =
    List.fold_left (fun b x -> b || x = k) false l

关于@ tonio答案的两条评论:

  • 使用||代替多余的if ... then true else ...
  • 使用结构相等(=)代替引用相等(==)来比较值。

此外,List module中提供了exists。内置函数更有效率,因为它不必每次都遍历整个列表。

答案 1 :(得分:5)

您应该使用类似

的内容
let exists k l =
    List.fold_left(
      fun a x -> if x == k then true else a)
      false l
;;

您的初始值为false,并在迭代列表时传递它。找到搜索到的元素后,将值设置为true,然后传递给它。如果列表中的元素不是您搜索的内容,请传递您输入的值:如果找到了您搜索的元素,则该值为初始falsetrue

答案 2 :(得分:1)

在答案提示后,我可以更多地改进它。

这是我的解决方案

let exists' f l =List.fold_left(fun a b->  f b || a  ) false l;;

像这样,这个函数更抽象,可以用于任何谓词f。