Seb*_*ila 1 haskell functional-programming
大家好,我想知道在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,{中断!}.有人可以解释一下为什么会发生这种情况,这两种情况有什么区别?
您的两个定义都适合该模式result = foo : bar : result.因此,在这两种情况下,我们最终得到的是一个循环列表,如下所示:
foo : bar : foo : bar : foo : bar : ...
在这两种情况下foo都是1如此,所以它不依赖于其他任何东西.但是bar.
在mgood你定义bar为等于列表的第三个元素时,所以bar等于foo,即1.因此,无论foo和bar是1,这就是你会得到什么:无限列表1秒.
在mbad你定义bar为等于第四个元素.所以bar等于自己.这种无限递归的定义bar在尝试评估时会导致无限循环bar.