2009-11-17 12 views
15

मुझे सूचियों की तरह मिलान अनुक्रमों के दौरान संरचनात्मक अपघटन की अनुमति देने वाले F # का पुराना संस्करण याद रखना प्रतीत होता है। अनुक्रम आलसी रखते हुए सूची वाक्यविन्यास का उपयोग करने का कोई तरीका है? मैं Seq.head और Seq.skip 1. करने के लिए कॉल का एक बहुतक्या एफ # में विघटित अनुक्रमों से मेल खाना संभव है?

मैं की तरह कुछ के लिए आशा करती हूं कि से बचने के लिए आशा करती हूं कि:

let decomposable (xs:seq<'a>) = 
    match xs with 
    | h :: t -> true 
    | _ -> false 
seq{ 1..100 } |> decomposable 

लेकिन यह केवल सूचियों संभालती है और एक प्रकार की त्रुटि जब देता है अनुक्रमों का उपयोग करना। List.of_seq का उपयोग करते समय, यह अनुक्रम में सभी तत्वों का मूल्यांकन करने लगता है, भले ही यह अनंत है।

उत्तर

21

यदि आप पावरपैक में LazyList प्रकार का उपयोग करते हैं, तो इसमें LazyList.Nil और LazyList नामक सक्रिय पैटर्न हैं। इस के लिए बहुत अच्छे हैं।

seq/IEnumerable प्रकार पैटर्न मिलान के लिए अनुकूल नहीं है; मैं इसके लिए LazyList की अत्यधिक अनुशंसा करता हूं। (Why is using a sequence so much slower than using a list in this example भी देखें।)

let s = seq { 1..100 } 
let ll = LazyList.ofSeq s 
match ll with 
| LazyList.Nil -> printfn "empty" 
| LazyList.Cons(h,t) -> printfn "head: %d" h 
+5

किसी भी व्यक्ति के लिए यहां लिंक करें (मुझे पसंद है) यह नहीं पता था कि पावर पैक क्या है: http://fsharppowerpack.codeplex.com/ – gatoatigrado

7

सेक सक्रिय पैटर्न में ठीक काम करता है! जब तक मैं कुछ यहाँ भयानक ...

let (|SeqEmpty|SeqCons|) (xs: 'a seq) = //' 
    if Seq.isEmpty xs then SeqEmpty 
    else SeqCons(Seq.head xs, Seq.skip 1 xs) 

// Stupid example usage 
let a = [1; 2; 3] 

let f = function 
    | SeqEmpty -> 0 
    | SeqCons(x, rest) -> x 

let result = f a 

कर रहा हूँ मैं कैसे StackOverflow के कोड एफ # मोड में प्रकाश डाला पाने के लिए पता नहीं है, मुझे लगता है कि इसे यहाँ OCaml का उपयोग कर तो सामान्य एनोटेशन निराला चला जाता है ...

+3

उदाहरणों के लिए एक चाल जहां आप एक सिंगल-कोट चाहते हैं: एक और एकल- रेखा के अंत में एक टिप्पणी में उद्धरण: // ' – harms

+7

यह एक साफ चाल है, लेकिन एक से अधिक विश्वसनीय स्रोत इंगित करता है कि अनुक्रम का मूल्यांकन करने के बाद से यह एक अच्छा पैटर्न नहीं है ओ (एन^2): http: // stackoverflow .com/प्रश्न/1306140/एफ-क्यों-उपयोग-ए-अनुक्रम-इतनी धीमी-से-उपयोग-एक-सूची-इन-उदाहरण/1306267 # 1306267 – Juliet

+1

सच है, लेकिन प्रश्नकर्ता का उदाहरण है रिकर्सिव नहीं अनुक्रम को रिकर्स करने के लिए यह स्पष्ट रूप से अच्छा नहीं है, लेकिन यदि आप सिर्फ सिर या कुछ पर पैटर्न मिलान करना चाहते हैं ... –

0

याद रखें कि सीएसी मानचित्रों को भी कम करता है, इसलिए आप अक्सर उन लोगों से दूर हो सकते हैं। उदाहरण में, आपका कार्य "Seq.isEmpty" के बराबर है। आप एफएसआई लॉन्च करने का प्रयास कर सकते हैं और टैब पूर्णता विकल्पों के माध्यम से चला सकते हैं ("सेक" दर्ज करें और टैब को बहुत हिट करें); यह हो सकता है कि आप क्या चाहते हैं।