在列表中循环<;列表<>>;在F#中查找值
本文关键字:gt lt 列表 查找 循环 | 更新日期: 2023-09-27 18:16:39
我在F#中有一个List<List<int>>
。我需要对它进行迭代,寻找给定的值val
。在C#中,我会做一些类似的事情:
public bool contains(List<List<int>> list, int value)
foreach (l in list ){
foreach(val in l){
if (val == value)
return true; //found value
}
}
return false;
}
我在F#中寻找等价物。我尝试了以下操作,但我做错了,因为我还不习惯F#语法:
type foo =
{
l : List<List<float>>
}
let contains (value: float) : bool =
for row in foo.l do
for val in row do
if (val == value)
true
false
上面的代码是错误的。
有人能建议我如何达到这个结果吗?
另一种略有不同的方法
let contains value items =
items
|> Seq.concat
|> Seq.exists ((=) value)
或者,更简洁地说
let contains value =
Seq.concat >> Seq.exists ((=) value)
这是C#代码的直接翻译:
let contains value (ls: _ list list) =
let mutable found = false
for row in ls do
if not found then
for el in row do
if not found && el = value then
found <- true
found
要修改F#中变量的值,应该使用mutable
或ref
关键字。然而,在F#的功能方式:
let contains value ls =
ls |> List.exists (List.exists ((=) value))
与作为句法糖的for .. in ... do
不同,高阶函数List.exists
在找到答案时会立即停止如果你的列表很大,这个版本就不能很好地扩展。您可以将列表转换为集合,以便能够更快地找到元素:
let contains value (ls: _ list list) =
ls |> List.concat |> Set.ofList |> Set.contains value