我想知道如何在 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
但显然是错误的。有什么建议怎么做吗?
let exists k l =
List.fold_left (fun b x -> b || x = k) false l
对@tonio 的回答有两条评论:
||
而不是多余的if ... then true else ...
。=
) 而不是引用相等 ( ==
) 来比较值。此外,exists
在List 模块中可用。内置函数更有效,因为它不必每次都遍历整个列表。
你应该使用类似的东西
let exists k l =
List.fold_left(
fun a x -> if x == k then true else a)
false l
;;
你有一个初始值false
,并在遍历列表时传递它。找到搜索的元素后,将值设置为true
,然后将其传递。如果列表中的元素不是您搜索的元素,请将您的值作为输入传递:它是初始值false
,或者true
您搜索的元素已经找到。
在得到答案的提示之后,我可以进一步改进它。
这是我的解决方案
let exists' f l =List.fold_left(fun a b-> f b || a ) false l;;
像这样,这个函数更加抽象,可以用于任何谓词 f。