ErikR और जॉन कोलमैन पहले से ही अपने प्रश्न के मुख्य भागों जवाब दे दिया है, फिर भी मैं अलावा कुछ का कहना चाहते हैं:
यह एक तरह से अपने कार्यों में लिखने के लिए है कि वे केवल निर्भर नहीं है सबसे अच्छा है उनके इनपुट की समाप्ति या अनंतता पर - कभी-कभी यह असंभव है लेकिन बहुत समय यह सिर्फ फिर से डिजाइन करने का मामला है। उदाहरण के लिए पूरी सूची के औसत की गणना करने के बजाय, आप एक चल रहे औसत की गणना कर सकते हैं, जो स्वयं ही एक सूची है; और इनपुट सूची अनंत होने पर यह सूची असीमित होगी, और अन्यथा सीमित होगी।
avg :: [Double] -> [Double]
avg = drop 1 . scanl f 0.0 . zip [0..]
where f avg (n, i) = avg * (dbl n/dbl n') +
i /dbl n' where n' = n+1
dbl = fromInteger
जिस स्थिति में आप एक अनंत सूची औसत सकता है, लेने के लिए नहीं होने अपने length
:
*Main> take 10 $ avg [1..]
[1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0]
दूसरे शब्दों में, एक ही विकल्प आपके कार्यों की के रूप में ज्यादा डिजाइन करने के लिए है करने के लिए बस अनन्त पहलू की परवाह नहीं करते हैं, और सूचियों के पूर्ण (पूर्ण) मूल्यांकन, और अन्य (संभावित रूप से अनंत) डेटा संरचनाओं में देरी करते हैं, जितना संभव हो सके आपके कार्यक्रम में एक चरण के अंत तक।
इस तरह, मैं अनुमान लगा रहा हूं, वे भी अधिक पुन: प्रयोज्य और संगत होंगे - इसके इनपुट के बारे में कम या अधिक सामान्य मान्यताओं के साथ कुछ भी अधिक संगत हो सकता है; इसके विपरीत, अधिक से अधिक विशिष्ट धारणाओं वाला कुछ भी कम कंपोज़ेबल होता है और इसलिए कम पुन: प्रयोज्य होता है।
स्रोत
2015-10-08 13:17:33
यह अजीब लगता है। यदि आप इसका उपयोग नहीं कर सकते हैं तो लंबाई कार्य क्यों मौजूद है? – ais
अच्छा - आप वापस आने के लिए अनंत सूची की 'लंबाई' क्या चाहते हैं? – ErikR
मैं पसंद करूंगा कि लंबाई अनंत सूचियों को स्वीकार नहीं करती है और '' 'FiniteList a -> Int''' – ais