Объединение предикатов в F #

Существует ли стандартный способ логического объединения предикатов в F #? Например, скажем, у меня естьisCar x а такжеisBlue x тогда я хочу что-то, что дает мне:

let isBlueCar x = isCar x && isBlue x

Но используя какую-то композицию, а не вызов, возможно, как:

let isBlueCar x = isCar && isBlue

Предпочтительно, чтобы что-то могло принимать большое / произвольное количество предикатов.

Ответы на вопрос(4)

Решение Вопроса

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

тогда делай

let isBlueCar = isCar <&> isBlue
 GregRos01 июн. 2012 г., 20:50
... и это действительно так просто, а? Я люблю F #.
 11 июн. 2012 г., 02:47
@GregRos - проверить FParsec (quanttec.com/fparsec), прекрасно обработанная библиотека синтаксического анализа, построенная с использованием комбинаторного подхода :-)
 GregRos11 июн. 2012 г., 21:19
У меня есть: P Я пишу код на нем, как мы говорим :)
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

Для него нет стандартной библиотечной функции, но есть множество однострочников, которые вы можете определить самостоятельно, о чем свидетельствуют ответы здесь.

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

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

> let isBlueCar = isCar &&< isBlue

val isBlueCar : (int -> bool)

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]
 11 нояб. 2017 г., 15:36
@RamonSnir Где этоflip определил хоть?
 11 нояб. 2017 г., 16:39
@GoodNightNerdPride Я не думаю, что он встроенный, вам нужно определить его самостоятельно:let flip f a b = f b a
 01 июн. 2012 г., 18:53
Или в бессмысленном синтаксисе:let isBlueCar = (|>) >> flip List.forall predicates

Ваш ответ на вопрос