我对 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>?