F# 函数在哪里存在?

F# 函数在哪里存在?,f#,where,exists,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 exists = any(row for row in dt.Rows if not row["Status

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

let exists = 
    let mutable e = false
    for row in dt.Rows do
        if row.["Status"] :?> bool = false
            then e <- true
    e
exists = any(row for row in dt.Rows if not row["Status"])
我可以用F#为exists函数编写一个类似的单行程序吗?

类似的内容(未测试):

dt.Rows |>Seq.exists(有趣的行->非(行。[“状态”]:?>bool))


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

let xs = [1;2;3]
let contains2 = xs |> Seq.exists (fun x -> x = 2)
但在您的特定情况下,它不会立即工作,因为
DataTable.Rows
属于
DataRowCollection
类型,它只实现
IEnumerable
,而不实现
IEnumerable
,因此它不会被视为F#意义上的“序列”,这意味着
Seq.
函数不会对其工作。要使它们工作,必须首先使用
Seq.cast
将序列转换为正确的类型:

let exists = 
   dt.Rows |> 
   Seq.cast<DataRow> |> 
   Seq.exists (fun r -> not (r.["Status"] :?> bool) )
let exists=
dt.行数|>
Seq.cast|>
Seq.exists(乐趣r->not(r.[状态]:?>bool))

Alas:Error 52类型“DataRowCollection”与类型“Sequalas”不兼容。我认为IEnumerable足以与Seq一起使用。另外,F#完全能够推断序列表达式中的集合类型:
Seq{for r in dt.Rows->r.[Status]}|>Seq.forall unbox |>not
perfect!我的回答很有帮助,请点击左边的灰色复选标记将其标记为“接受”。