क्योंएस ++ टी बड़े पैमाने पर एक स्टैक ओवरफ़्लो क्यों नहीं लेता है?
Prelude> head $ reverse $ [1..10000000] ++ [99]
99
एक ढेर अतिप्रवाह त्रुटि लिए नेतृत्व नहीं करता मैं सोच रहा हूँ। प्रस्तावना में ++ सीधे आगे और लगता है गैर पूंछ पुनरावर्ती:
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
संपादित करें: प्रारंभ में, मैंने सोचा था कि इस मुद्दे को विशेष रूप से नए सिरे से लिखना के साथ, जिस तरह ++ प्रस्तावना में परिभाषित किया गया है के साथ क्या करने के लिए कुछ नहीं है नियम, इसलिए सवाल नीचे जारी रहा। चर्चा ने मुझे दिखाया कि यह मामला नहीं है। मुझे लगता है कि अब कुछ आलसी मूल्यांकन प्रभाव कोड को स्टैक ओवरफ़्लो के बिना चलाने का कारण बनता है, लेकिन मुझे यह नहीं पता कि कैसे।
तो बस इसके साथ, इसे एक स्टैक ओवरफ़्लो में चलाया जाना चाहिए, है ना? तो मैं समझ यह शायद GHC जादू कि ++ की परिभाषा इस प्रकार के साथ कुछ है:
{- # नियम "++" [~ 1] forall XS वाईएस। xs ++ ys = augment (\ c n -> foldr c n xs) ys # -}
* क्या यह स्टैक ओवरफ़्लो से बचने में मदद करता है? क्या कोई इस कोड के टुकड़े में क्या हो रहा है इसके लिए कुछ संकेत प्रदान कर सकता है? **
पुनर्लेखन नियम दुभाषिया में आग नहीं है (जब तक आप उन्हें सक्षम)। –
@ डॉन: धन्यवाद, मैंने उन्हें सक्षम नहीं किया था। वैसे भी, मुझे टाइपिंग करने से पहले इसे जांचना चाहिए था: एक नया फ़ंक्शन "fst = if s == [] फिर t और (x: ss) = s में x: (f ss t)" का कारण नहीं है एक ढेर ओवरफ्लो, इसलिए इसका नियमों के साथ कुछ भी नहीं हो सकता है ... – martingw