एक सूची की एक उपधारा होने का पसंदीदा तरीका क्या है और क्यों 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]