मैं शुद्ध गणना कैसे कर सकता हूं जो बहुत अधिक समय ले रहा है? मैंनेशुद्ध कार्यों को समाप्त करना
import System.Timeout
fact 0 = 1
fact n = n * (fact $ n - 1)
main = do maybeNum <- timeout (10^7) $ (return . fact) 99999999
print maybeNum
हालांकि, यह काम नहीं करता है। (return . fact) 99999999
को "असली" आईओ फ़ंक्शन के साथ getLine
पर बदलें और यह अपेक्षा के अनुसार काम करता है।
दिलचस्प है कि अगर 'वास्तविक' बनें "वास्तविक" आईओ कार्रवाई ('तथ्य 0 = वापसी 1; तथ्य एन = (एन *) \' fmap \ '(तथ्य $ n - 1)') फिर 'टाइमआउट 'के रूप में कार्य करता है भी उम्मीद की –
@ मेटवेएक्सनोव: मुझे लगता है कि यह इतना नहीं है क्योंकि यह कार्य एक वास्तविक आईओ क्रिया है, लेकिन क्योंकि इसका पुनरावृत्ति 'एफएमएपी' के माध्यम से है, 'आईओ' मोनैड में स्थानांतरित हो गया है। – leftaroundabout
यदि आपको मनमाने ढंग से और संभावित रूप से दुर्भावनापूर्ण कोड टाइमआउट करने की आवश्यकता है, तो सुनिश्चित करें कि वास्तव में सरल गैर-आवंटित लूप के विरुद्ध परीक्षण करना सुनिश्चित करें, उदा। x x में x = x को चलो और 'x() = x() x() 'में दें। –