相关疑难解决方法(0)

理解递归定义的列表(就zipWith而言)

我正在学习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 list fibonacci lazy-evaluation lazy-sequences

67
推荐指数
2
解决办法
7739
查看次数

Funky haskell懒惰列表隐式递归

在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我们再次计算的第二个元素,等等......

!!仅仅是索引到一个列表,所以这意味着在指数获得元素 …

haskell lazy-evaluation

12
推荐指数
3
解决办法
697
查看次数