2015-09-24 5 views
7

है परिणाम परिणाम कभी-कभी आधार सूची से अधिक लंबा होता है। इसके लिए कोई सुराग? जैसेइस हास्केल उदाहरण में मानचित्र की परिणाम सूची

Prelude> let x3 = [1,3..10] :: [Double] 
Prelude> length x3 
6 
Prelude> let x3 = [1,3..10] :: [Int] 
Prelude> length x3 
5 

टिप्पणी के जवाब में अद्यतन ...

एक परिभाषा:

Prelude> let x3 = [1,3..10] 
Prelude> x3 
[1,3,5,7,9] 
Prelude> length x3 
5 
Prelude> length $ map (+1) x3 
5 
Prelude> length $ map (*3) x3 
5 
Prelude> length $ map (/2) x3 
6 
Prelude> length $ map (/1) x3 
6 
Prelude> length $ map (`div`1) x3 
5 
Prelude> map log x3 
    [0.0,1.0986122886681098,1.6094379124341003 
    ,1.9459101490553132,2.1972245773362196,2.3978952727983707] 
Prelude> length it 
6 
+7

यह '..' परिभाषित सूचियों के विलुप्त होने के कारण होना चाहिए, और यह फ़्लोटिंग पॉइंट नंबरों के साथ अजीब तरीके से कैसे व्यवहार करता है। [हास्केल रेंज और फ्लोट्स] देखें (http://stackoverflow.com/q/7290438/2751851)। – duplode

+2

'[1,3..10]' एक बुरा विचार है, खासकर फ्लोटिंग पॉइंट नंबरों का उपयोग करना। इसके बजाय '[1,3..9]' या '[1,3..11]' का उपयोग करें। संख्या '10' आखिरी" चरण "(9 से 11 तक) के मध्य में बिल्कुल गिरती है, इसलिए गोल करने का फैसला होगा कि 10 के करीब निकटतम अनुमान 9 या 11 है। – chi

+2

@chi, मेरी राय में, जो दोष में डालता है गलत जगह फ्रैक्शनल नंबर (और * विशेष रूप से * फ़्लोटिंग पॉइंट प्रस्तुतियों) के पास 'एनम' कक्षा में कोई व्यवसाय नहीं है। इस तरह के फ्लोट्स की सूची प्राप्त करने का सौहार्दपूर्ण तरीका 'इंटेग्रल [1,3..जो भी] से मानचित्र है। – dfeuer

उत्तर

4

@duplode के रूप में सुझाव दिया है, यह चल बिन्दु बनाम पूर्णांकों के साथ कैसे बर्ताव करता है .. के साथ क्या करना है यह ghci में:

let xs = [1,3..11] 

पॉलिमॉर्फिक है। ..enumFromThenTo समारोह के लिए एक शॉर्टकट है:

let xs = enumFromThenTo 1 3 11 

परिणाम बहुरूपी है - ऊपर अभिव्यक्ति प्रकार का है:

ghci> :t xs 
x3 :: (Enum t, Num t) => [t] 

तुम सिर्फ इसे प्रिंट, तो हास्केल टाइप करने के लिए चुनता है [Integer] के रूप में है, और आपको मिलता है:

[1,3,5,7,9] 

यहां enumFromThenTo का इंटीजर संस्करण उपयोग किया जा रहा है।

हालांकि, अगर आप सूची में एक चल बिन्दु आपरेशन लागू होते हैं, हास्केल यह [Double] के रूप में व्याख्या, और फिर इसे एक तत्व कारणों के लिए लंबे समय तक कि ऊपर बताया गया हो जाता है:

ghci> map (+ 0.0) x3 
[1.0,3.0,5.0,7.0,9.0,11.0] -- length 6 now! 

तो map ऑपरेशन "परिवर्तन" सूची की लंबाई केवल इसलिए कि यह इसके प्रकार की व्याख्या को बदलती है जो कि enumFromThenTo फ़ंक्शन को बनाने के लिए कहा जाता है।

उपशॉट: [1,3..11] जैसे परिभाषित सूची में इसकी लंबाई निर्धारित होने तक ज्ञात लंबाई नहीं है।

+0

क्षमा करें, लेकिन समस्या मूल सूची नहीं है, लेकिन मानचित्र से गणना की गई सूची –

+0

अद्यतन उत्तर - उम्मीद है कि यह और अधिक बताएगा। – ErikR

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