.net f# functional-programming composition

.net - Combinando Predicados en F#



functional-programming composition (4)

¿Es esto lo que estás buscando?

> let (&&<) a b x = a x && b x val ( &&< ) : (''a -> bool) -> (''a -> bool) -> ''a -> bool > let isBlueCar = isCar &&< isBlue val isBlueCar : (int -> bool)

¿Hay una forma estándar de combinar lógicamente los predicados en F #? Por ejemplo, digamos que tengo isCar x y isBlue x entonces quiero algo que me dé:

let isBlueCar x = isCar x && isBlue x

Pero usar algún tipo de composición, en lugar de invocación, tal vez como:

let isBlueCar x = isCar && isBlue

Preferiblemente, ese algo sería capaz de aceptar un número grande / arbitrario de predicados.


Podrías definir un combinador.

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

entonces hazlo

let isBlueCar = isCar <&> isBlue


Podrías hacer algo como lo siguiente:

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

Más generalmente:

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


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)

como en

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

No hay una función de biblioteca estándar para ello, pero hay una gran cantidad de líneas de unipersonal que puede definir por su cuenta, como lo demuestran las respuestas aquí.