Combining Predicates in F#

前端 未结 4 1343
日久生厌
日久生厌 2021-02-18 17:44

Is there a standard way of logically combining predicates in F#? For example, let\'s say I have isCar x and isBlue x then I want something that gives m

相关标签:
4条回答
  • 2021-02-18 17:59
    let meetsAll preds = preds |> Seq.fold (fun p q x -> p x && q x) (fun _ -> true)
    // or     let meetsAll preds x = preds |> Seq.forall (fun p -> p x)
    

    as in

    let isEven x = x%2 = 0
    let isDiv5 x = x%5 = 0
    let isDiv7 x = x%7 = 0
    
    let div257 = meetsAll [isEven; isDiv5; isDiv7]
    
    for i in 1..100 do
        if div257 i then
            printfn "%d" i
    

    There is no standard library function for it, but there are a plethora of one-liners you can define on your own, as evidenced by the answers here.

    0 讨论(0)
  • 2021-02-18 18:02

    You could do something like the following:

    let predicates = [isCar; isBlue]
    let isBlueCar x = predicates |> List.forall (fun predicate -> predicate x)
    

    More generally:

    let combinePredicates predicates =
        fun x -> predicates |> List.forall (fun predicate -> predicate x)
    
    let isBlueCar = combinePredicates [isCar;isBlue]
    
    0 讨论(0)
  • 2021-02-18 18:13

    Is this what you're looking for?

    > let (&&<) a b x = a x && b x
    
    val ( &&< ) : ('a -> bool) -> ('a -> bool) -> 'a -> bool
    
    > let isBlueCar = isCar &&< isBlue
    
    val isBlueCar : (int -> bool)
    
    0 讨论(0)
  • 2021-02-18 18:19

    You could define a combinator.

    let (<&>) f g = (fun x -> f x && g x)
    

    then do

    let isBlueCar = isCar <&> isBlue
    
    0 讨论(0)
提交回复
热议问题