user1443098
user1443098

Reputation: 7645

F# exists where function?

I have a function processing a DataTable looking for any row that has a column with a certain value. It looks like this:

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

I'm wondering if there is a way to do this in a single expression. For example, Python has the "any" function which would do it something like this:

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

Can I write a similar one-liner in F# for my exists function?

Upvotes: 2

Views: 376

Answers (2)

Fyodor Soikin
Fyodor Soikin

Reputation: 80744

You can use the Seq.exists function, which takes a predicate and returns true if the predicate holds for at least one element of the sequence.

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

But in your specific case, it won't work right away, because DataTable.Rows is of type DataRowCollection, which only implements IEnumerable, but not IEnumerable<T>, and so it won't be considered a "sequence" in F# sense, which means that Seq.* functions won't work on it. To make them work, you have to first cast the sequence to the correct type with Seq.cast:

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

Upvotes: 4

bergey
bergey

Reputation: 3071

Something like this (untested):

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

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

Upvotes: 0

Related Questions