F# 函数在哪里存在?
我有一个函数处理一个DataTable,查找任何一行中有一个具有特定值的列。看起来是这样的: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
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!我的回答很有帮助,请点击左边的灰色复选标记将其标记为“接受”。