Haskell循环定义中断

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
Run Code Online (Sandbox Code Playgroud)

对于上面的代码,我得到这个输出[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
Run Code Online (Sandbox Code Playgroud)

我得到这个输出[1,{中断!}.有人可以解释一下为什么会发生这种情况,这两种情况有什么区别?

sep*_*p2k 9

您的两个定义都适合该模式result = foo : bar : result.因此,在这两种情况下,我们最终得到的是一个循环列表,如下所示:

foo : bar : foo : bar : foo : bar : ...
Run Code Online (Sandbox Code Playgroud)

在这两种情况下foo都是1如此,所以它不依赖于其他任何东西.但是bar.

mgood你定义bar为等于列表的第三个元素时,所以bar等于foo,即1.因此,无论foobar1,这就是你会得到什么:无限列表1秒.

mbad你定义bar为等于第四个元素.所以bar等于自己.这种无限递归的定义bar在尝试评估时会导致无限循环bar.