我想知道如何在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
但显然是错的。有什么建议吗?
答案 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
,然后传递给它。如果列表中的元素不是您搜索的内容,请传递您输入的值:如果找到了您搜索的元素,则该值为初始false
或true
。
答案 2 :(得分:1)
在答案提示后,我可以更多地改进它。
这是我的解决方案
let exists' f l =List.fold_left(fun a b-> f b || a ) false l;;
像这样,这个函数更抽象,可以用于任何谓词f。