2012-02-28 9 views
7

मैं हास्केल (और सामान्य रूप से कार्यात्मक प्रोग्रामिंग) के लिए नया हूं और सोच रहा था कि मैं विपक्ष (:) ऑपरेटर का उपयोग कर सूची में जो एक नया तत्व एक्सेस कर सकता हूं, मैं कैसे सोच सकता हूं?मैं एक सूची तत्व का उपयोग कैसे करूं जिसे मैंने विपक्ष (:) ऑपरेटर के साथ जोड़ा है?

उदाहरण के लिए

, WinGHCi का उपयोग कर रहा एक नई सूची बनाने और पहला तत्व का उपयोग:

ghci> let a = [1,2,3] 
ghci> a!!0 
1 

शीघ्र रिटर्न 1, पहले तत्व का मान, शांत। अब मैं सूची के सामने से एक नया मान संलग्न करें और यह तक पहुँचने का प्रयास:

ghci> 5:a 
[5,1,2,3] 
ghci> a!!0 
1 

यह सूची आइटम नहीं मिलता है फिर से अनुक्रमित तरह दिखता है। मैंने काम करने और अन्य ऐसी चीजों को नकारात्मक सूचकांक प्राप्त करने का प्रयास किया लेकिन संकलक को मंजूरी नहीं मिली। मैं जो ट्यूटोरियल पढ़ रहा हूं उसे बस छोड़ दें और मुझे ऑनलाइन उपयोग के कुछ भी नहीं मिल सका। मैं सूची से मूल्य "5" कैसे प्राप्त करूं?

मदद के लिए धन्यवाद और खेद है कि यह एक बहुत ही बुनियादी सवाल है।

+3

मार्सीन के बिंदु को चित्रित करने के लिए, जीएचसीआई पर 'ए' टाइप करें और आप [1,2,3] देखेंगे, क्योंकि आप हास्केल में एक चर को संशोधित नहीं कर सकते हैं। चीजों को स्पष्ट करने के लिए, [चर और असाइन करने योग्य इन परिभाषाओं] पर विचार करें (http: //existentialtype.wordpress।कॉम/2012/02/01/शब्द-पदार्थ /): हास्केल गणित के अर्थ में 'चर' है, लेकिन अनिवार्य भाषाओं में 'असाइन करने योग्य' नहीं है। –

+0

ए अभी भी [1,2,3] 5 के बाद है: a.raa कार्यात्मक प्रोग्रामिंग में उत्परिवर्तन जैसे कोई दुष्प्रभाव नहीं हैं – nist

+0

हां मुझे यह मिल गया है, यह सिर्फ सोचने का एक और तरीका है ... हाहा। सबको धन्यवाद! – Awesominator

उत्तर

12

यह विचार कार्यात्मक प्रोग्रामिंग के मूल पर स्थित है: आप (आमतौर पर) डेटा को संशोधित नहीं कर रहे हैं। तो आप सूची में कोई आइटम नहीं जोड़ते: आप पुराने को संशोधित किए बिना एक नई सूची बनाते हैं।

यह कई अच्छी चीजों के लिए अनुमति देता है, उदाहरण के लिए साझा करना, क्योंकि आप पुराने डेटा को कभी नहीं बदल रहे हैं और इसलिए आप इसका जिक्र कर सकते हैं। लेकिन यदि आप अन्य प्रोग्रामिंग प्रतिमानों के आदी हैं, तो यह भी बोझ लगाता है: आपको चीजों से संपर्क करने के लिए अपना रास्ता बदलना होगा (और अक्सर आपको अपने डेटा संरचनाओं/एल्गोरिदम को बदलना होगा क्योंकि वे डेटा संरचना के इन-प्लेस संशोधन पर निर्भर थे) ।

let a = [1, 2, 3] 
let b = 5:a 
7

आपकी गलतफहमी मौलिक है: विपक्ष कुछ भी विनाशकारी रूप से संशोधित नहीं करता है।

5:a (जहां a = [1,2,3]) [5,1,2,3] का मूल्यांकन करता है, और यही वह है जो दुभाषिया आपको दिखा रहा है।

2

सूचियाँ अपरिवर्तनीय हैं:

Prelude> let xs = [1,2,3] 
Prelude> 4:xs 
[4,1,2,3] 
Prelude> xs 
[1,2,3] 
Prelude> let ys = 4:xs 
Prelude> ys 
[4,1,2,3] 

आप डेटा संरचना के तत्वों को परिवर्तित करना चाहते हैं, तो Arrays का उपयोग करें।

6

मेरे साथ उदाहरण देकर स्पष्ट करना (+) करते हैं और साथ ही (:)

Prelude> 4+5 
9 
Prelude> let z = 5 
Prelude> z 
5 
Prelude> 4+z 
9 
Prelude> z 
5 
Prelude> let y = 4+z 
Prelude> y 
9 
Prelude> z 
5 

बनाम

:

अपने उदाहरण में, बस cons'ed सूची में एक नया नाम दे

Prelude> let a = [1,2,3] 
Prelude> a 
[1,2,3] 
Prelude> 5:a 
[5,1,2,3] 
Prelude> a 
[1,2,3] 
Prelude> let b = 5:a 
Prelude> b 
[5,1,2,3] 
Prelude> a 
[1,2,3] 

'चलो' के साथ बने बाइंडिंग कभी नहीं बदलते हैं, लेकिन नए लोगों को बनाया जा सकता है। यदि एक नया बाध्यकारी पुराने बाध्यकारी के समान नाम है तो पुराने बाध्यकारी "छायांकित" नहीं है।

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

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