चूंकि आप अपने फ़ंक्शन की प्रगति देखना चाहते हैं (जो फ़ंक्शन का दुष्प्रभाव है) सबसे स्पष्ट समाधान मोनैड का उपयोग करना है। ऐसा करने के लिए पहली बात यह है any
समारोह की एक monadic संस्करण बनाने के लिए है:
anyM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool
anyM _ [] = return False
anyM pred (x:xs) = reduce (pred x) xs
where reduce acc [] = acc
reduce acc (x:xs) = do
condition <- acc
if condition
then return condition
else reduce (pred x) xs
ऊपर समारोह anyM
any
समारोह की एक monadic संस्करण है। यह हमें यह जांचने के अलावा दुष्प्रभाव उत्पन्न करने की अनुमति देता है कि दी गई सूची में कोई भी वस्तु दी गई भविष्यवाणी को पूरा करती है या नहीं।
anyVar :: (a -> Bool) -> [a] -> IO Bool
anyVar pred xs = anyM check $ zip [1..] xs
where check (n,x) = do
putStrLn $ show n ++ " checked. "
return $ pred x
सूचना है कि क्योंकि हम लंबाई पता नहीं है:
हम एक और समारोह जो any
फ़ंक्शन को निष्पादित करने के रूप में इस के अलावा एक पक्ष प्रभाव के रूप में एक प्रगति बार प्रदर्शित करता है बनाने के लिए anyM
समारोह का उपयोग कर सकते सूची में से पहले हम केवल सूची में आइटम की संख्या प्रदर्शित करते हैं। हम सूची में आइटम्स की संख्या पता है पहले से तो हम एक अधिक सूचनात्मक प्रगति बार प्रदर्शित कर सकते हैं:
anyFix :: (a -> Bool) -> Int -> [a] -> IO Bool
anyFix pred length xs = anyM check $ zip [1..] xs
where check (n,x) = do
putStrLn $ show (100 * n `div` length) ++ "% (" ++
show n ++ "/" ++ show length ++ " checked). "
return $ pred x
अनंत सूचियों के लिए और सूचियों जिसकी लंबाई आप पहले से पता नहीं है के लिए anyVar
समारोह का उपयोग करें। सीमित सूचियों के लिए anyFix
फ़ंक्शन का उपयोग करें जिनकी लंबाई आप पहले से जानते हैं।
यदि सूची बड़ी है और आप पहले सूची की लंबाई नहीं जानते हैं तो length
फ़ंक्शन को इसकी लंबाई निर्धारित करने के लिए संपूर्ण सूची को पार करने की आवश्यकता होगी। इसलिए इसके बजाय anyVar
का उपयोग करना बेहतर होगा।
अंत में रैप करने के लिए यह यह सब कैसे आप ऊपर कार्यों का उपयोग होता है:
main = anyFix (==2000) 2000 [1..2000]
आपके मामले में आप के बजाय निम्न कर सकता है:
main = anyVar check xs
आशा इस जवाब आप मदद की।
स्रोत
2013-10-13 11:33:44
यदि आप बड़े डेटा सेट के साथ कुछ भारी उठाने कर रहे हैं, तो सूची का उपयोग न करें। सूची सीखने के लिए अच्छी है लेकिन असली दुनिया ऐप – Ankur
में बुरी तरह से प्रदर्शन करती है, साथ ही, कोई भी स्थिति वापस आने वाले तत्व को प्राप्त करने के बाद वापस आ जाएगा, उस स्थिति में यह दिखाने की प्रगति है कि कुल तत्वों से कितने तत्व संसाधित होते हैं, यह समझ में नहीं आता है – Ankur
@ अंकुर यह समझ में आता है, क्यों नहीं? इसका अर्थ यह हो सकता है कि '30% तत्वों को संसाधित किया गया है और कुछ भी उपयुक्त नहीं पाया गया है ' – pfedotovsky