The collections modules in F# all define an exists function that takes a predicate and an instance of the collection. If any item in the collection meets the predicate, exists returns true. Otherwise, it returns false.
[1..12] |> List.exists (fun n -> n = 11) // val it : bool = true [|1..12|] |> Array.exists (fun n -> n < 1) // val it : bool = false set [1..12] |> Set.exists (fun n -> n % 2 = 0) // val it : bool = true seq [1..12] |> Seq.exists (fun n -> n > 20) // val it : bool = false
Of course, as lists, arrays, and sets are all sequences, we can use Seq.exists for all of them:
[1..12] |> Seq.exists (fun n -> n = 11) // val it : bool = true [|1..12|] |> Seq.exists (fun n -> n < 1) // val it : bool = false set [1..12] |> Seq.exists (fun n -> n % 2 = 0) // val it : bool = true
Strings are collections/sequences of characters, so both of the following are valid:
"asdf" |> String.exists (fun c -> c = 's') // val it : bool = true "asdf" |> Seq.exists (fun c -> c = 'b') // val it : bool = false
The Map module also defines an exists function, but the predicate takes two inputs: one for the key and one for the value.
[("A", 1); ("B", 2); ("C", 4); ("D", 8)]
|> Map.ofList
|> Map.exists (fun k v -> (k,v) = ("C",4))
// val it : bool = true
And of course, if you want to test only the key or only the value, name the input of no interest with an underscore in the lambda.
[("A", 1); ("B", 2); ("C", 4); ("D", 8)]
|> Map.ofList
|> Map.exists (fun k _ -> k = "Z")
// val it : bool = false
[("A", 1); ("B", 2); ("C", 4); ("D", 8)]
|> Map.ofList
|> Map.exists (fun _ v -> v = 2)
// val it : bool = true
The Option module also defines an exists function. If the option is Some, then exists applies the predicate to the value in the Some instance and returns the result. If the option is None, then exists always returns false.
Some "X" |> Option.exists (fun s -> s = "X") // val it : bool = true Some "X" |> Option.exists (fun s -> s = "Y") // val it : bool = false None |> Option.exists (fun s -> s = "X") // val it : bool = false