में अपवाद मैं हास्केल में एक अनंत लूप समस्या में भाग गया और समझ नहीं पा रहा हूं कि कारण क्या है। मेरे पास नीचे एक ही कोड के तीन संस्करण हैं। पहला व्यक्ति अनंत लूप का कारण बनता है जबकि बाद वाले दो नहीं करते हैं। यह एक सरणी उत्पन्न करने के लिए कुछ बुनियादी संकुचित कोड है। इस मामले में इसमें केवल तीन आइटम हैं और एकमात्र रिकर्सिव कॉल तीसरी वस्तु के लिए है जो पहले दो में से बड़ा है। if a > b
कथन एक लूप का कारण प्रतीत होता है (लेकिन बाद में मैं दिखाता हूं कि यह कारण नहीं हो सकता है)।अजीब <<loop>> ऐरे पीढ़ी
import Data.Array
main :: IO()
main = print grid
where grid = array (0, 2) $ map func [0 .. 2]
func i
| i == 2 = let a = grid ! (i - 1)
b = grid ! (i - 2)
in if a > b
then (i, a)
else (i, b)
| otherwise = (i, 0)
निम्नलिखित संस्करण में, मैं बस if
बयान के बजाय max a b
का उपयोग करें। यहां कोई लूप नहीं है।
main :: IO()
main = print grid
where grid = array (0, 2) $ map func [0 .. 2]
func i
| i == 2 = let a = grid ! (i - 1)
b = grid ! (i - 2)
in (i, max a b)
| otherwise = (i, 0)
निम्नलिखित संस्करण में, मैं बजाय func
से एक टपल लौटने का if
लेकिन zip
सूचकांक रहते हैं। यह भी ठीक चलाता है।
main :: IO()
main = print grid
where grid = array (0, 2) $ zip [0 .. 2] $ map func [0 .. 2]
func i
| i == 2 = let a = grid ! (i - 1)
b = grid ! (i - 2)
in if a > b
then a
else b
| otherwise = 0
उन दो अन्य मामलों पुनरावर्ती परिभाषा या if
बयान के उपयोग के साथ कोई समस्या नहीं है कि वहाँ दिखाने के लिए लग रहे हैं।
लूप के कारण के रूप में क्या छोड़ता है? इस टपल अपनी पहली घटक में i
है कि (कंप्यूटिंग या तो a
या b
से पहले) (i, max a b)
में, हम जानते हैं:
इस प्रश्न का बयान बिल्कुल सही है, समस्या का पालन करने के लिए पर्याप्त कोड, साथ ही कुछ अवलोकन जो उनके चेहरे पर पूरी तरह से विरोधाभासी हैं। इसके अलावा आप जो भी सोचते हैं उसकी एक स्पष्ट रूपरेखा समस्या और साक्ष्य हो सकती है जो नहीं थी। बस चारों ओर एक प्यारा पहेली। –