Ich lief in Haskell in eine Endlosschleife Problem und kann nicht verstehen, was die Ursache ist. Ich habe drei Versionen des gleichen Codes unten. Die erste verursacht eine Endlosschleife, während die letzteren nicht. Dies ist ein grundlegender künstlicher Code, um ein Array rekursiv zu erzeugen. In diesem Fall hat es nur drei Elemente und der einzige rekursive Aufruf ist für das dritte Element, das das größere der ersten beiden auswählt. Die if a > b
-Anweisung scheint eine Schleife zu verursachen (aber später zeige ich, dass sie nicht die Ursache sein kann).Seltsame <<loop>> Ausnahme in Array-Generation
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)
In der folgenden Version, habe ich einfach max a b
anstelle der if
Anweisung verwenden. Keine Schleife hier.
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)
In der folgenden Version, halte ich die if
aber zip
die Indizes statt eines Tupels von func
zurück. Dieser läuft auch gut.
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
Diese beiden anderen Fällen scheinen zu zeigen, dass es kein Problem mit der rekursiven Definition oder die Verwendung der if
Aussage.
Was bleibt als Ursache der Schleife übrig? Hier
Die Aussage dieser Frage ist übrigens absolut perfekt: gerade genug Code, um das Problem zu beobachten, plus einige Beobachtungen, die auf ihrem Gesicht sind völlig widersprüchlich. Plus eine klare Übersicht über das, was Sie dachten, könnte das Problem und Beweise dafür sein, dass es nicht war. Nur ein schönes Puzzle rundherum. –