我遇到了Haskell中的無限循環問題,無法理解原因是什麼。我有三個版本的下面相同的代碼。第一個會導致無限循環,而後兩者不會。這是遞歸生成數組的一些基本設計的代碼。在這種情況下,它只有三個項目,而唯一的遞歸調用是第三個項目,它選擇前兩個中較大的項目。 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)
在接下來的版本中,我簡單地使用max a b
代替if
聲明。這裏沒有循環。
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
語句沒有問題。
作爲循環的原因是什麼呢?
順便提一句,這個問題的說法絕對完美:只要有足夠的代碼來觀察問題,再加上一些在他們面前完全相互矛盾的觀察。再加上你認爲可能是問題和證據的明確輪廓。四周只是一個可愛的謎題。 –