在列表中循环<;列表<>>;在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

上面的代码是错误的。

有人能建议我如何达到这个结果吗?

在列表中循环<;列表<>>;在F#中查找值

另一种略有不同的方法

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#中变量的值,应该使用mutableref关键字。然而,在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