我对 Haskell 还是很陌生,我正试图弄清楚斐波那契数列的惰性表达是如何工作的。
我知道以前有人问过这个问题,但没有一个答案能解决我在可视化结果时遇到的问题。
该代码是使用的规范代码zipWith
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
我理解以下内容:
zipWith
从字面上将两个列表压缩在一起tail
抓取列表中除第一个元素之外的所有元素- Haskell 将“未来”计算数据引用为
thunks
.
据我了解,它首先添加[0,1,<thunk>]
并[1,<thunk>]
使用zipWith (+)
to give [1,<thunk>]
。所以现在你有
fibs = 0 : 1 : 1 : zipWith (+) fibs (tail fibs)
我在谷歌上搜索的很多参考资料都开始将上面的行“可视化”为
fibs = 0 : 1 : 1 : zipWith (+) [1,1,<thunk>] ([1,<thunk>]).
我的问题是这样的:
为什么上 fibs
一行中的组件只对应于 [1,1,<thunk>]
而不是 [0,1,1,<thunk>]
?
不应该fibs
包含整个列表加<thunk>
?