4

我想知道如何在 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

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

4

3 回答 3

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

对@tonio 的回答有两条评论:

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

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

于 2012-05-02T13:14:37.470 回答
5

你应该使用类似的东西

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

你有一个初始值false,并在遍历列表时传递它。找到搜索的元素后,将值设置为true,然后将其传递。如果列表中的元素不是您搜索的元素,请将您的值作为输入传递:它是初始值false,或者true您搜索的元素已经找到。

于 2012-05-02T12:49:02.263 回答
1

在得到答案的提示之后,我可以进一步改进它。

这是我的解决方案

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

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

于 2012-05-08T00:37:48.960 回答