22

F#で述語を論理的に組み合わせる標準的な方法はありますか?たとえば、私が持っていてisCar xisBlue xそれから私に何かを与えるものが欲しいとしましょう:

let isBlueCar x = isCar x && isBlue x

しかし、呼び出しではなく、ある種の構成を使用すると、次のようになります。

let isBlueCar x = isCar && isBlue

好ましくは、その何かが多数の/任意の数の述語を受け入れることができるであろう。

4

4 に答える 4

26

コンビネータを定義できます。

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

その後、

let isBlueCar = isCar <&> isBlue
于 2012-06-01T16:48:56.637 に答える
7
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)

のように

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

そのための標準ライブラリ関数はありませんが、ここでの回答から明らかなように、独自に定義できるワンライナーが多数あります。

于 2012-06-01T16:54:22.737 に答える
5

次のようなことができます。

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

より一般的には:

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

let isBlueCar = combinePredicates [isCar;isBlue]
于 2012-06-01T16:49:54.457 に答える
2

これはあなたが探しているものですか?

> let (&&<) a b x = a x && b x

val ( &&< ) : ('a -> bool) -> ('a -> bool) -> 'a -> bool

> let isBlueCar = isCar &&< isBlue

val isBlueCar : (int -> bool)
于 2012-06-01T16:47:04.120 に答える