2011-04-02 10 views
5

में उप-सरणी लेना मैं हास्केल में उप सरणी कैसे प्राप्त करूं?हास्केल

+2

क्या आप जानते हैं कि पहली जगह में सरणी कैसे प्राप्त करें? आप किस सरणी पुस्तकालय के बारे में बात कर रहे हैं? Data.Vector? Data.Array? इस सवाल को वास्तव में fleshed बाहर की जरूरत है। –

+0

@TomMD subArray Data.Array – Rnet

+1

डेटा। ऐरे बल्कि बदसूरत है और इसमें कोई संलयन नहीं है, मेरा सुझाव है कि आप डेटा देखें। भविष्य की सरणी आवश्यकताओं के लिए वेक्टर। –

उत्तर

9

मुझे लगता है कि आप Data.Array दस्तावेज में 'व्युत्पन्न सरणियों' अनुभाग है के लिए देख रहे: http://hackage.haskell.org/packages/archive/array/latest/doc/html/Data-Array.html#5 जो समारोह घरों:

ixmap :: (Ix i, Ix j) => (i, i) -> (i -> j) -> ऐरे जे -> ऐरे यानी

ixmap सरणी सूचकांक में परिवर्तन के लिए अनुमति देता है। यह मूल सरणी के मानचित्रण के साथ दाईं ओर फ़ंक्शन संरचना प्रदान करने के रूप में सोचा जा सकता है।

फ्रेक्टर कक्षा के ऐरे इंस्टेंस> से fmap का उपयोग करके सरणी मानों का एक समान परिवर्तन प्राप्त किया जा सकता है।

निम्नलिखित कोड:

ixmap newBounds trans backingArray 

सीमा newBounds साथ एक सरणी में हो जाएंगे और जब !i साथ अनुक्रमित, सूचकांक परिवर्तन समारोह सूचकांक backingArray करने के लिए इस्तेमाल किए जाने से पहले सूचकांक i पर लागू किया जाता है।


उदाहरण यदि आप सरणी "नमस्ते दुनिया" (नीचे helloWorldArray) था और आप केवल एक व्युत्पन्न शून्य आधारित (उप) सरणी के रूप में देखते हैं "ell" करना चाहते हैं:

> let helloWorldArray = listArray (0,length str - 1) str -- 0-based array 
    where str = "Hello World" 

> let ellArray = ixmap (0,2) succ helloWorldArray   -- also 0-based array 

> ellArray ! 0 
'e' 
> ellArray ! 1 
'l' 
> ellArray ! 2 
'l' 

यहां हम कहते हैं कि हमारी नई सरणी ellArray में 0 से 2 के सूचकांक हैं। हमारा सूचकांक परिवर्तन केवल एक (succ) जोड़ने के लिए है, क्योंकि हम मूल helloWorldArray में इंडेक्स रेंज [0..2][1..3] पर मैप करना चाहते हैं।

बेशक, ixmap किसी भी इंडेक्स ट्रांसफॉर्मेशन को कैप्चर करने के लिए पर्याप्त सार है: यहां तक ​​कि 2 आयामी सरणी को 1 आयामी सरणी और इसके विपरीत के रूप में देखने के लिए। 'सब-सरणी' फ़ंक्शन की तुलना में सरणी डेटा बल्कि पर 'व्यू' बनाने के बारे में सोचना बेहतर है।

अधिक उदाहरण आप यहाँ देख सकते हैं के लिए: http://zvon.org/other/haskell/Outputarray/ixmap_f.html

2

मुझे उप-सरणी (यानी टुकड़ा) प्राप्त करने का कोई सीधा तरीका नहीं मिला, लेकिन यह मध्यवर्ती सूची के माध्यम से ऐसा करने का एक तरीका है।

import Data.Array 

subArray :: Int -> Int -> Array -> Array 
subArray i j a = listArray (0,j-i) $ map (a!) [i..j] 
4

vector पैकेज का उपयोग उप सरणियों ले रहा है शायद सबसे आसान दृष्टिकोण (यह मानते हुए कि आपके सवाल का वास्तव में उप-सूचियों लेने के बारे में पूछ नहीं है) है।

सामान्य वेक्टर/सरणी इंटरफ़ेस से प्रासंगिक फ़ंक्शन है:

  • slice:: Vector v a => Int -> Int -> v a -> v a

लेकिन आप यह भी ले के बारे में पता और ड्रॉप चाहिए। टुकड़ा एक सूचकांक और लंबाई लेता है, और उप-सरणी निकालता है।