मैं हाल ही में राइटर मोनाड के साथ खेल रहा हूं, और मैंने में स्थानांतरित किया है जो एक अंतरिक्ष रिसाव प्रतीत होता है। मैं नहीं कह सकता कि मैं इन चीजों को अभी तक पूरी तरह से समझता हूं, इसलिए मैं जानना चाहता हूं कि यहां क्या हो रहा है, और इसे कैसे ठीक किया जाए।स्पेस लीक, और राइटर्स, और सैम्स (ओह माय!)
सबसे पहले, यहाँ कैसे मैं इससे यह त्रुटि उत्पन्न कर सकते हैं:
import Control.Monad.Writer
import Data.Monoid
foo :: Integer -> Writer (Sum Integer) Integer
foo 0 = return 0
foo x = tell (Sum x) >> foo (pred x)
main = print $ runWriter $ foo 1000000
मैं:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
इस बेहतर ढंग से समझने के लिए, मैं लेखक या योग के बिना इसी तरह की सुविधा reimplemented किया है, और अगर मैं चीजें अच्छी और आलसी रखता हूं, मुझे समान त्रुटि मिलती है:
bar :: Integer -> (Integer, Integer)
bar x = bar' 0 x
where bar' c 0 = (0, c)
bar' c x = bar' (c + x) (pred x)
,210
लेकिन मैं समीकरण को seq
जोड़कर इस उपाय कर सकते हैं:
bar' c x = c `seq` bar' (c + x) (pred x)
मैं अपने foo
समारोह के seq
ing विभिन्न बिट्स की कोशिश की है, लेकिन वह प्रतीत नहीं होता है मदद करने के लिए। इसके अलावा, मैंने Control.Monad.Writer.Strict
का उपयोग करने का प्रयास किया है, लेकिन कोई फर्क नहीं पड़ता है।
क्या Sum
किसी भी तरह सख्त होने की आवश्यकता है? या क्या मुझे कुछ अलग है?
नोट्स
- मैं गलत यहाँ मेरी शब्दावली हो सकता है। Space leak zoo के अनुसार, मेरी समस्या को 'स्टैक ओवरफ़्लो' के रूप में वर्गीकृत किया जाएगा, और यदि यह मामला है, तो मैं
foo
को और अधिक पुनरावृत्ति शैली में कैसे परिवर्तित करूं? क्या मेरा मैनुअल समस्या का पुनरावृत्ति है? - Haskell Space Overflow पढ़ने के बाद, मेरे पास
-O2
के साथ संकलित करने का विचार था, बस यह देखने के लिए कि क्या होता है। यह के लिए एक अन्य प्रश्न हो सकता है, लेकिन अनुकूलन के साथ, यहां तक कि मेरेseq
'डीbar
फ़ंक्शन चलाने में विफल रहता है। अद्यतन: यदि मैं-fno-full-laziness
जोड़ता हूं तो यह समस्या दूर हो जाती है। सख्त लेखक इकाई के लिए स्रोत पर
'Sum' एक 'newtype' है, इसलिए यह अंतर्निहित प्रकार के रूप में सख्त या आलसी है। – hammar