F#存在哪里功能?

时间:2017-03-29 20:14:58

标签: f# where exists

我有一个处理DataTable的函数,用于查找具有特定值的列的任何行。它看起来像这样:

let exists = 
    let mutable e = false
    for row in dt.Rows do
        if row.["Status"] :?> bool = false
            then e <- true
    e

我想知道是否有办法在单个表达式中执行此操作。例如,Python具有“any”功能,可以这样做:

exists = any(row for row in dt.Rows if not row["Status"])

我可以在F#中为我的存在函数写一个类似的单行吗?

2 个答案:

答案 0 :(得分:4)

您可以使用Seq.exists函数,该函数接受谓词,如果谓词适用于序列的至少一个元素,则返回true。

let xs = [1;2;3]
let contains2 = xs |> Seq.exists (fun x -> x = 2)

但在您的具体情况下,它不会立即生效,因为DataTable.Rows属于DataRowCollection类型,它只实现IEnumerable,而不是IEnumerable<T>,并且因此它不会被视为F#意义上的“序列”,这意味着Seq.*函数将无法使用它。要使它们起作用,您必须首先使用Seq.cast

将序列转换为正确的类型
let exists = 
   dt.Rows |> 
   Seq.cast<DataRow> |> 
   Seq.exists (fun r -> not (r.["Status"] :?> bool) )

答案 1 :(得分:0)

像这样(未经测试):

dt.Rows |> Seq.exists (fun row -> not (row.["Status"] :?> bool))

https://msdn.microsoft.com/visualfsharpdocs/conceptual/seq.exists%5b%27t%5d-function-%5bfsharp%5d