使用fold_left在OCaml中搜索元素

Joã*_*ira 4 ocaml list

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

exists 3 [1;2;3;4;5] 
=> true
Run Code Online (Sandbox Code Playgroud)

这个函数的类型是: a -> bool -> 'a list -> bool

我的想法如何做到如下:

let exists k l = List.fold_left( fun a x-> a=x) k l
Run Code Online (Sandbox Code Playgroud)

但显然是错的.有什么建议怎么办?

pad*_*pad 6

let exists k l =
    List.fold_left (fun b x -> b || x = k) false l
Run Code Online (Sandbox Code Playgroud)

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

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

此外,existsList模块中可用.内置函数更有效,因为它不必每次都遍历整个列表.


ton*_*nio 5

你应该使用类似的东西

let exists k l =
    List.fold_left(
      fun a x -> if x == k then true else a)
      false l
;;
Run Code Online (Sandbox Code Playgroud)

您有一个初始值false,并在迭代列表时传递它.找到搜索到的元素后,将值设置为true,然后传递它.如果列表中的元素不是您搜索的内容,请传递您输入的值:它是初始值false,或者true是否已找到您搜索的元素.