F #

2009-12-31 15 views
15

में किसी सूची से कार्यक्षमता की तरह स्लाइस एक सरणी let foo = [|1;2;3;4|] के साथ मैं किसी भी सरणी से एक टुकड़ा वापस करने के लिए निम्न में से किसी एक का उपयोग कर सकता हूं।F #

foo.[..2] 
foo.[1..2] 
foo.[2..] 

मैं सूची let foo2 = [1;2;3;4] के लिए एक ही चीज़ कैसे कर सकता हूं? जब मैं सरणी के रूप में एक ही वाक्यविन्यास का प्रयास करता हूं तो मुझे error FS00039: The field, constructor or member 'GetSlice' is not defined.

किसी सूची का उपखंड प्राप्त करने का पसंदीदा तरीका क्या है और वे GetSlice का समर्थन करने के लिए क्यों नहीं बनाए गए हैं?

उत्तर

36

एक सूची की एक उपधारा होने का पसंदीदा तरीका क्या है और क्यों GetSlice समर्थन करने के लिए बनाया नहीं कर रहे हैं?

के अंतिम प्रश्न पहली और पहला सवाल पिछले करते हैं:

क्यों सूचियों का समर्थन नहीं करते GetSlice

सूचियाँ जुड़ा हुआ सूची के रूप में लागू किया जाता है, तो हम कुशल अनुक्रमित की जरूरत नहीं है उन तक पहुंच तुलनात्मक रूप से बोलते हुए, foo.[|m..n|]O(n-m) सरणी के लिए समय लेता है, समकक्ष वाक्यविन्यास सूचियों पर O(n) समय लेता है। यह एक बहुत बड़ा सौदा है, क्योंकि यह हमें उन मामलों के विशाल बहुमत में कुशलता से स्लाइसिंग सिंटैक्स का उपयोग करने से रोकता है जहां यह उपयोगी होगा।

let foo = [|1 .. 100|] 
let size = 4 
let fuz = [|for a in 0 .. size .. 100 do yield foo.[a..a+size] |] 

लेकिन अगर हम बजाय एक सूची उपयोग कर रहे थे:

उदाहरण के लिए, हम रैखिक समय में बराबर आकार के टुकड़ों में एक सरणी अप कटौती कर सकते हैं? foo.[a..a+size] पर प्रत्येक कॉल में लंबा और लंबा समय लगेगा, पूरा ऑपरेशन O(n^2) है, जो इसे नौकरी के लिए बहुत अनुपयुक्त बनाता है।

अधिकांश समय, सूची को टुकड़ा करना गलत दृष्टिकोण है। हम सामान्य रूप से सूचियों और सूची में हेरफेर करने के लिए पैटर्न मिलान का उपयोग करते हैं।

सूची को टुकड़ा करने के लिए पसंदीदा विधि?

जहां भी संभव हो, पैटर्न मिलान का उपयोग करें यदि आप कर सकते हैं। अन्यथा, आप आप के लिए सूची और दृश्यों अप कटौती करने के लिए Seq.skip और Seq.take पर वापस गिर कर सकते हैं:

> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;; 
val it : int list = [4; 5; 6; 7; 8] 
8

# 4,0 एफ सूची (link) के लिए वाक्य रचना करने की क्रिया के लिए अनुमति देगा।

दलील here है:।

एफ # सूची प्रकार पहले से ही एक सूचकांक ऑपरेटर का समर्थन करता है, XS [3]। यह तथ्य इस तथ्य के बावजूद किया जाता है कि एफ # - सूचियों में लिस्ट सूचियों की सूचियां एफ # में इतनी सामान्य रूप से उपयोग की जाती हैं कि एफ # 2.0 में इसका समर्थन करने का निर्णय लिया गया था।

चूंकि इंडेक्स सिंटैक्स समर्थित है, इसलिए यह F # स्लाइसिंग सिंटैक्स का समर्थन करने के लिए भी समझ में आता है, उदा। XS। [3..5]। स्लाइसिंग का उपयोग करने के लिए सरणी प्रकार पर स्विच करना बहुत अजीब है, लेकिन आपको इंडेक्सिंग के लिए यह स्विच नहीं करना है।

फिर भी, जूलियट ने जवाब दिया कि, सूची में फिसलने का अधिकांश समय गलत दृष्टिकोण है, फिर भी यह सच है। तो इस सुविधा का उपयोग करते समय बुद्धिमान बनें।

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

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