F #

2012-06-01 7 views
20

में भविष्यवाणियों का मिश्रण F # में तर्कसंगत रूप से संयोजन का एक मानक तरीका है?F #

let isBlueCar x = isCar x && isBlue x 

लेकिन रचना के कुछ प्रकार का उपयोग कर, बल्कि मंगलाचरण से, हो सकता है की तरह:

let isBlueCar x = isCar && isBlue 

अधिमानतः, कि उदाहरण के लिए, मान लीजिए कि मैं isCar x और isBlue x है तो मैं कुछ है कि मुझे देता है चाहते हैं कुछ भविष्यवाणी की एक बड़ी/मनमानी संख्या स्वीकार करने में सक्षम हो जाएगा।

उत्तर

21

आप एक संयोजक को परिभाषित कर सकते हैं।

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

तो

let isBlueCar = isCar <&> isBlue 
+3

... और यह वास्तव में इतना आसान है, हुह? मुझे एफ # पसंद है। – GregRos

+0

@ ग्रेगरोस - एफपीआरसीईसी (http://www.quanttec.com/fparsec) देखें, जो कि संयोजक दृष्टिकोण का उपयोग करके निर्मित एक खूबसूरती से तैयार की गई पार्सिंग लाइब्रेरी है :-) – theburningmonk

+0

मेरे पास है: पी मैं इस पर कोड लिख रहा हूं जैसा कि हम बोलते हैं:) – GregRos

2

क्या आप यह देख रहे हैं?

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

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

> let isBlueCar = isCar &&< isBlue 

val isBlueCar : (int -> bool) 
4

आप निम्न की तरह कुछ कर सकता है:

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] 
+1

या पॉइंट-फ्री सिंटैक्स में: 'चलो ब्लूकर = (|>) >> फ्लिप सूची .forll भविष्यवाणी करता है' –

+0

@RamonSnir हालांकि 'फ्लिप' कहां परिभाषित किया गया है? –

+0

@GoodNightNerdPride मुझे नहीं लगता कि यह अंतर्निहित है, आपको इसे स्वयं परिभाषित करने की आवश्यकता है: 'फ्लिप एफ को बी = एफ बी ए' –

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) 

रूप

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 

में इसके लिए कोई मानक पुस्तकालय समारोह है, लेकिन एक-लाइनर्स के रूप में यहाँ जवाब इसका सबूत आप अपने दम पर परिभाषित कर सकते हैं, के एक बहुतायत देखते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे