Haskell循环定义中断

时间:2018-02-18 23:07:39

标签: 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,{Interrupted!}。有人可以解释一下为什么会发生这种情况,这两种情况之间有什么区别?

1 个答案:

答案 0 :(得分:9)

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

foo : bar : foo : bar : foo : bar : ...

在这两种情况下,foo都是1,所以它并不依赖于其他任何内容。但bar确实如此。

mgood中,您将bar定义为等于列表的第三个元素,因此bar等于foo,即1。因此,foobar都是1,这就是你得到的:1 s的无限列表。

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