结合F#中的谓词

Gre*_*Ros 20 .net f# functional-programming composition

是否有一种在F#中逻辑组合谓词的标准方法?例如,让我说我有isCar x,isBlue x然后我想要一些给我的东西:

let isBlueCar x = isCar x && isBlue x
Run Code Online (Sandbox Code Playgroud)

但是使用某种组合而不是调用,可能就像:

let isBlueCar x = isCar && isBlue
Run Code Online (Sandbox Code Playgroud)

优选地,某些东西能够接受大量/任意数量的谓词.

Dan*_*iel 23

您可以定义组合子.

let (<&>) f g = (fun x -> f x && g x)
Run Code Online (Sandbox Code Playgroud)

然后做

let isBlueCar = isCar <&> isBlue
Run Code Online (Sandbox Code Playgroud)

  • ......真的很容易,对吧?我爱F#. (3认同)

Ste*_*sen 6

您可以执行以下操作:

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

更普遍:

let combinePredicates predicates =
    fun x -> predicates |> List.forall (fun predicate -> predicate x)

let isBlueCar = combinePredicates [isCar;isBlue]
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 5

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)
Run Code Online (Sandbox Code Playgroud)

如在

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
Run Code Online (Sandbox Code Playgroud)

它没有标准的库函数,但是你可以自己定义过多的单行函数,这里的答案就是证明.