2011-09-10 14 views
5

में फ्लोट मानों के दो सरणी जोड़ना कोई भी उदाहरण प्रदान कर सकता है जिसमें हास्केल में दो सरणी शामिल हैं?हास्केल

मैं हास्केल के लिए बिल्कुल नया हूं, और मुझे आम तौर पर पता चलता है कि मैं एक सरल भाषा सीखकर कुछ सीख सकता हूं और देख रहा हूं कि एक और प्रोग्रामर अपनी भाषा में ऐसा कैसे कर सकता है।

कुछ कोड देखना बहुत अच्छा होगा जो फ्लोट के दो सरणी बनाता है और एक फ़ंक्शन को कॉल करता है जिसके परिणामस्वरूप समेकित मानों के साथ एक सरणी होती है। निम्नलिखित सी कोड के बराबर कुछ।

void addTwoArrays(float *a, float *b, float *c, int len) { 
    int idx=0; 
    while (idx < len) { 
     c[idx] = a[idx] + b[idx]; 
    } 
} 

int N = 4; 
float *a = (float*)malloc(N * sizeof(float)); 
float *b = (float*)malloc(N * sizeof(float)); 
float *c = (float*)malloc(N * sizeof(float)); 

a[0]=0.0; a[1]=0.1; a[2]=0.2; a[3]=0.4; 
b[0]=0.0; b[1]=0.1; b[2]=0.2; b[3]=0.4; 
addTwoArrays(a,b,c,N); 

उसी परिणाम प्राप्त करने वाले हास्केल कोड को देखने से मेरी समझ में बहुत मदद मिलेगी। मुझे लगता है कि हैकेल संस्करण परिणाम सरणी बना देगा और इसे वापस करेगा, जैसे c = addTwoArrays (ए, बी, एन)?

धन्यवाद।

उत्तर

5

हास्केल में, इस प्रश्न के लिए, आप सरणियों के बजाय सूचियों का उपयोग होगा (हालांकि सरणी, वेक्टर मौजूद हास्केल में, उसकी टिप्पणी के लिए धन्यवाद थॉमस एम Dubuisson) और कोड की तरह इस

addTwoArrays :: (Num a) => [a]->[a]->[a] 
addTwoArrays _ [] = [] 
addTwoArrays [] _ = [] 
addTwoArrays (x:xs) (y:ys) = (x+y) : (addTwoArrays xs ys) 

यह हो जाएगा फ़ंक्शन दो सरणी लेगा जिनमें संख्यात्मक मान (इंट्स, फ्लोट्स इत्यादि) होंगे और उन्हें छोटी लंबाई तक योगित किया जाएगा।

लेकिन हम कार्यात्मक भाषा सुविधाओं का उपयोग कर के साथ एक ही समारोह लिख सकते हैं:

addTwoArrays :: (Num a) => [a]->[a]->[a] 
addTwoArrays xs ys :: zipWith (+) xs ys 

दोनों कार्यों दो सूचियों का समय लगेगा और योग, छोटे से एक के आधार पर देता है।

addTwoArrays [1.0, 2.0, 3.0] [2.0, 3.0, 4.0] --returns [3.0, 5.0, 7.0] and 

addTwoArrays [1.0, 2.0, 3.0] [2.0, 3.0] --returns [3.0, 5.0] 
+4

या बस बस 'addTwoArrays = zipWith (+) '। – hammar

+0

आप सही हैं, हालांकि मैंने सोचा कि एक नए शिक्षार्थी के लिए, एक करीबी की तुलना में सामान्य कार्य परिभाषा दिखाना बेहतर होगा। चूंकि ये बाद के अध्यायों में विषय हैं :) –

+0

देखें http://www.willamette.edu/~fruehr/haskell/evolution।एचटीएमएल –

10

सादगी की खातिर के लिए मैं उपयोग करने के लिए (लिंक किए गए), सरणियों के बजाय सूचीबद्ध करता है के रूप में वे और अधिक आसानी से सूची शाब्दिक का उपयोग कर बनाया जा सकता है जा रहा हूँ।

a = [0, 0.1, 0.2, 0.4] 
b = [0, 0.1, 0.2, 0.4] 
c = zipWith (+) a b 

zipWith एक समारोह जो कि किसी अन्य समारोह और दो सूचियों लेता है और फिर उसी सूचकांक में सूचियों के तत्वों में से प्रत्येक जोड़ी को दिया समारोह लगाने से एक नई सूची बनाता है। तो यहां हम जिस समारोह को zipWith पर देते हैं + है और इस प्रकार यह दो सूचियों के तत्व जोड़ता है।

अगर हम zipWith का उपयोग किए बिना यह करने के लिए करना चाहता था हम addTwoLists इस तरह निर्धारित कर सकते हैं:

addTwoLists [] _ = [] 
addTwoLists _ [] = [] 
addTwoLists (x:xs) (y:ys) = (x+y) : (addTwoLists xs ys) 

तर्क है कि यहाँ जब सूचियों में से एक खाली है, addTwoLists एक खाली सूची वापस आ जाएगी है। अन्यथा यह दो सूचियों के सिर (यानी a+b) के सिर की राशि वापस कर देगा, जो उनकी पूंछ को एक साथ जोड़ने के परिणामस्वरूप तैयार है।

4

अन्य उत्तरों के अलावा: ज़िपिंग फ़ंक्शंस Vector एस के लिए भी मौजूद है। वेक्टर असली सरणी हैं और लिंक्ड सूचियां नहीं हैं, हालांकि यदि संभव हो तो कंप्यूटर वैक्टर को दूर कर सकता है। अधिक जानकारी प्राप्त करने के लिए उपरोक्त लिंक को देखें।

+0

+1। –