2012-04-09 20 views
18

मैं शुद्ध गणना कैसे कर सकता हूं जो बहुत अधिक समय ले रहा है? मैंनेशुद्ध कार्यों को समाप्त करना

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

दिलचस्प है कि अगर 'वास्तविक' बनें "वास्तविक" आईओ कार्रवाई ('तथ्य 0 = वापसी 1; तथ्य एन = (एन *) \' fmap \ '(तथ्य $ n - 1)') फिर 'टाइमआउट 'के रूप में कार्य करता है भी उम्मीद की –

+0

@ मेटवेएक्सनोव: मुझे लगता है कि यह इतना नहीं है क्योंकि यह कार्य एक वास्तविक आईओ क्रिया है, लेकिन क्योंकि इसका पुनरावृत्ति 'एफएमएपी' के माध्यम से है, 'आईओ' मोनैड में स्थानांतरित हो गया है। – leftaroundabout

+2

यदि आपको मनमाने ढंग से और संभावित रूप से दुर्भावनापूर्ण कोड टाइमआउट करने की आवश्यकता है, तो सुनिश्चित करें कि वास्तव में सरल गैर-आवंटित लूप के विरुद्ध परीक्षण करना सुनिश्चित करें, उदा। x x में x = x को चलो और 'x() = x() x() 'में दें। –

उत्तर

20

मुद्दा यह है कि

return (fact 999999999) 

तुरंत वापस आती है और समय समाप्ति ट्रिगर नहीं करता है। यह एक थंक देता है जिसका मूल्यांकन बाद में किया जाएगा।

आप वापसी मान के मूल्यांकन के लिए मजबूर हैं, तो

main = do maybeNum <- timeout (10^7) $ return $! fact 99999999 
      print maybeNum 

यह टाइमआउट को गति प्रदान (यदि आप एक ढेर इतना बड़ा प्रदान करें ताकि समय समाप्ति ढेर अतिप्रवाह से पहले होता है) चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^