我正在学习Haskell,并且遇到了以下代码:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
就其工作方式而言,我在解析方面遇到了一些麻烦.它非常整洁,我知道不需要更多内容,但我想了解Haskell在写作时如何设法"填写"文件:
take 50 fibs
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
谢谢!
在Haskell中,由于懒惰,您可以构建无限列表:
Prelude> let g = 4 : g
Prelude> g !! 0
4
Prelude> take 10 g
[4,4,4,4,4,4,4,4,4,4]
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试构建这样的列表时到底发生了什么?
Prelude> let f = f !! 10 : f
Prelude> f !! 0
Interrupted.
Prelude> take 10 f
[Interrupted.
Prelude>
Run Code Online (Sandbox Code Playgroud)
该Interrupted.s的我按CTRL + C等待几秒钟后.它似乎陷入无限循环,但为什么会这样呢?
非Haskellers的解释:
该:操作是prepend:
Prelude> 4 : [1, 2, 3]
[4,1,2,3]
Run Code Online (Sandbox Code Playgroud)
这一行:
Prelude> let g = 4 : g
Run Code Online (Sandbox Code Playgroud)
说"让我们g通过预先4列入名单来构建清单g".当你要求第一个元素时,返回4,因为它已经存在.当你要求第二个元素时,它会查找4之后的元素.该元素将是列表的第一个元素g,我们刚刚计算(4),因此4返回.下一个元素是g我们再次计算的第二个元素,等等......
!!仅仅是索引到一个列表,所以这意味着在指数获得元素 …