大家好,我想知道在Haskell中学习循环定义的好奇心。我们有这两种情况:
module Main
where
mgood = 1:head (tail (tail mgood)):mgood
list = take 10 mgood
main = do
print list
对于上面的代码,我得到了这个输出[1,1,1,1,1,1,1,1,1,1],我理解为什么但问题出在这段代码中:
module Main
where
mbad = 1:head (tail (tail (tail mbad))):mbad
list = take 10 mbad
main = do
print list
我得到这个输出[1,{Interrupted!}。有人可以解释一下为什么会发生这种情况,这两种情况之间有什么区别?
答案 0 :(得分:9)
您的两个定义都符合模式result = foo : bar : result
。因此,在这两种情况下,我们最终得到的是一个循环列表,如下所示:
foo : bar : foo : bar : foo : bar : ...
在这两种情况下,foo
都是1
,所以它并不依赖于其他任何内容。但bar
确实如此。
在mgood
中,您将bar
定义为等于列表的第三个元素,因此bar
等于foo
,即1
。因此,foo
和bar
都是1
,这就是你得到的:1
s的无限列表。
在mbad
中,您将bar
定义为等于第四个元素。所以bar
等于自己。在尝试评估bar
时,bar
的这种无限递归定义会导致无限循环。