2011-06-05 21 views
9

में एक 2 डी ग्रिड जनरेट कर रहा है सीखना Haskell और एक समारोह एक 2D ग्रिड के समान उत्पन्न करना चाहते सी में आप कैसे हो सकता है:हास्केल

int data[3][3] 

क्या एक स्वीकार्य और सुरुचिपूर्ण दृष्टिकोण है? पिन? Foldl?

मैं की तरह एक घोषित कर सकता है:

x = [[0,0,0], 
    [0,0,0], 
    [0,0,0]] 

लेकिन मैं एक्स y मानकों के साथ एक समारोह चाहते हैं।/के लिए बिना सबसे आसान तरीका समझने के लिए while लूप :(

+1

"जेनरेट" से आपका क्या मतलब है? – vicvicvic

+1

@ चक्रवात: हास्केल में लूप के लिए क्या लगता है? – Gabe

+0

@Gabe: मुझे कुछ कल्पना होगी जैसे http://www.xoltar.org/old_site/2003//sep/09/haskellLoops.html – Cyclone

उत्तर

18

आप पूछ रहे हैं कि "हास्केल में Arrays के बजाय मुझे क्या उपयोग करना चाहिए", है ना? आपने सूचियों का उपयोग करने के बारे में पूछा, जो निश्चित रूप से सरणी नहीं हैं और गैर-अनुक्रमिक पहुंच की आवश्यकता वाले किसी भी गंभीर कार्य के लिए टालना चाहिए (उदाहरण के लिए, सूची ओ (एन) के बजाय ओ (एन) तत्व पहुंच प्रदान करती है)।

पैकेज जिन्हें आपको विचार करना चाहिए: सरणी (पुराना, मानक हास्केल सरणी), वेक्टर (नया, धारा संलयन, तेज़, एक एपीआई जो वास्तव में उचित, बॉक्सिंग या अनबॉक्स किया जाता है, लेकिन केवल एक आयाम जब तक आप उन्हें घोंसला नहीं देते), और रेपा (केवल नए जीएचसी संस्करणों पर काम करता है, लेकिन बहु-आयामी सरणी और समानांतर संचालन को अनबॉक्स किए गए प्रस्तुतियों पर भी अनुमति देता है)।

इनमें से किसी भी को शुरू करने का सबसे आसान तरीका (मुझे लगता है कि जब आप "जेनरेट" कहते हैं तो "प्रारंभ करें" का मतलब है) उनके संबंधित "सूची" फ़ंक्शन हैं। उदाहरण के लिए:

import Data.Vector as V 
... 
    V.fromList $ map V.fromList [[01,02,03],[11,12,13],[22,22,23]] 
+1

उचित अंक, टॉमएमडी! मैं "गंभीर काम" शब्द को ऑब्जेक्ट की तरह करता हूं - प्रदर्शन महत्वपूर्ण महत्वपूर्ण आईएमएचओ है। – vicvicvic

+1

vicvicvic: दाएं, I _just_ ने उस भाग को बेहतर कॉल करने के लिए संपादित किया है जिसका अर्थ है कि मेरा प्रदर्शन महत्वपूर्ण गैर अनुक्रमिक पहुंच है। –

3

मैं (:: [[a]]) सूचियों का एक सूची का उपयोग करेंगे, शायद कुछ नए प्रकार के साथ यह सुनिश्चित करें कि कि सभी सूचियों समान लंबाई के हैं संघर्ष।

करने के लिए n मूल्यों से युक्त एक सूची बनाते हैं, आप replicate :: Int -> a -> [a] उपयोग कर सकते हैं, इसलिए सूचियों की एक सूची उत्पन्न करने के लिए, तुम बस फिर से सूची को दोहराने होगी ...

grid :: Int -> Int -> a -> [[a]] 
grid x y = replicate y . replicate x 

यहाँ, a पैरामीटर आप किसी के साथ सूची तैयार करने के लिए अनुमति देता किसी भी प्रकार का "शून्य" मान। इसका उपयोग इस तरह किया जा सकता है:

> grid 3 3 0 
[[0,0,0],[0,0,0],[0,0,0]] 
> grid 2 3 False 
[[False,False],[False,False],[False,False]] 

संपादित करें: इस समन्वय प्रणाली (y, x) मुझे पता है (मैं (row, column) में सोच रहा था) का उपयोग करता है। "सामान्य" प्रणाली प्राप्त करने के लिए आप grid में एक्स और वाई को स्वैप कर सकते हैं।

+0

सूचियां सरणी के लिए बहुत खराब प्रतिस्थापन हैं। जब तक आप सुनिश्चित न हों कि आपके पास कोई प्रदर्शन समस्या नहीं होगी, डोमिनिक, मैं ओ (1) एक्सेस के साथ एक अलग डेटा संरचना पर विचार करूंगा। –

+0

वाह जो बहुत ही सुरुचिपूर्ण है। धन्यवाद। अब दोहराने के लिए समझने के लिए! –

+0

@TomdMD।हम्म अच्छी तरह से प्रदर्शन महत्वपूर्ण नहीं है, बेहतर होने पर मैं एक बेवकूफ समाधान का उपयोग नहीं करना चाहूंगा। डेटा में देखेंगे। वेक्टर –

3

आप कुछ तेजी से पढ़ता है और उचित तेजी से "अपडेट" के साथ भी जटिल नहीं करना चाहते हैं, तो आप कुंजी के रूप में एक Map (import Data.Map) (x,y) साथ जोड़े का उपयोग पर विचार करना चाहिए। रेंज चेक के लिए सहायक कार्यों को जोड़ें और अनुपलब्ध प्रविष्टियों के लिए डिफ़ॉल्ट मान लौटने के लिए, और आपके पास एक अच्छा प्रतिस्थापन है (जब तक मैट्रिक्स विशाल नहीं है)