मुझे पहली बार अपने समारोह थोड़ा पुनर्लेखन दो,
रूप
isListOk :: Bool
isListOk = length (filter isItemOk [1 .. 1000]) <= 3
तार्किक रूप से आपके संस्करण की तुलना में अधिक मुहावरेदार है। (ध्यान दें कि मैं भी रूप में तुम्हारा गलत थी प्रकार हस्ताक्षर बदल दिया है। इसके अलावा, आप 1 .. 1000
लिखा जाना चाहिए था बल्कि 1.1000
से।)
आलसी मूल्यांकन अपने सबसे अच्छे दोस्त यहाँ है, के रूप में यह आम तौर पर सुनिश्चित करें कि कोई अनावश्यक संगणना हो जाएगा कर देगा प्रदर्शन किया।
दुर्भाग्यवश, length
का उपयोग (या प्रत्येक तत्व को सूची से 1 तक मैप करना और उसके परिणामस्वरूप सूची को सूचीबद्ध करना) जैसा कि आप करते हैं) यहां रास्ते में आ रहा है। यही है, length
सूची की रीढ़ की हड्डी में सख्त है: यह केवल सूची की लंबाई का उत्पादन कर सकता है अगर यह इसके अंत में मूल्यांकन करता है, जो इस मामले में, इसका मतलब है कि आपके कार्यक्रम को आपके चेक को हजार बार ।
एक समाधान लंबाई की गणना को जोड़ना होगा (यानी।
isNotLongerThan :: [a] -> Integer -> Bool
isNotLongerThan [] n = n >= 0
isNotLongerThan (_ : xs) n = n >= 1 && isNotLongerThan xs (n - 1)
और उसके बाद लिखें:, सूची की रीढ़ का ट्रेवर्सल) और परीक्षण गणना लंबाई एक भी समारोह अपने तर्क सूची की रीढ़ की हड्डी में आलसी वास्तव में यह है कि में एक दी गई सीमा से अधिक नहीं है कि क्या
isListOk :: Bool
isListOk = filter isItemOk [1 .. 1000] `isNotLongerThan` 3
एक पुन: प्रयोज्य समाधान के लिए, आप निश्चित रूप से दोनों विधेय और सीमा से अधिक सार कर सकते हैं: Hammar, बताते हैं
forNoMoreThan :: (a -> Bool) -> Integer -> [a] -> Bool
forNoMoreThan p n = (`isNotLongerThan` n) . filter p
isListOk :: Bool
isListOk = (isItemOk `forNoMoreThan` 3) [1 .. 1000]
अंत में, यदि आपके ताड़ना पुराना छोटा और निश्चित छोटा है, आप यह निर्धारित करने के लिए पैटर्न मिलान का उपयोग कर सकते हैं कि कोई सूची पर्याप्त है या नहीं।
आपका फ़ंक्शन 'ले' और 'सूची समझ' के रूप में 4 से अधिक नहीं दिखता है आलसी हैं। 'Int' का उपयोग करने का प्रयास करें यदि आप जानते हैं कि आपका नंबर सीमा से आगे नहीं बढ़ेगा क्योंकि यह' इंटेगर 'से बहुत तेज है। यह 'बूल' है और 'बूलेन' नहीं है। 'isListOk' को एक सूची तर्क लेना चाहिए। – Satvik