尽管可以使用此线程,但是由于答案的不同,我不允许在答案下问我的问题,因此我不得不为此创建一个新问题。(我只是stackoverflow中的新手:)
关于以下fib功能如何工作,我并不清楚
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
nichijou逐步解释了我从nichijou引用的以下线程:
首先,我们使用fib和tail fib可以得到第3个:
Run Code Online (Sandbox Code Playgroud)fibs : [1, 1, ? tail fibs : [1, ? zipWith (+) fibs (tail fibs): [2, ?现在,我们知道第三个是2,我们可以得到第四个:
Run Code Online (Sandbox Code Playgroud)fibs : [1, 1, 2, ? tail fibs : [1, 2, ? zipWith (+) fibs (tail fibs): [2, 3, ?现在的第五名:
Run Code Online (Sandbox Code Playgroud)fibs : [1, 1, 2, 3, ? tail fibs : [1, 2, 3, ? zipWith (+) fibs (tail fibs): [2, 3, 5, ?等等 ..
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
我的问题是,在第二步之后,我们如何摆脱列表中的重复项?我期望看到第二步应该生成一个列表
[1, 1, 2, 2, 3]
Run Code Online (Sandbox Code Playgroud)
下一步也是如此...
让我们用更多的标签写出来:
fibs :: [Integer]
fibs = 1 : 1 : sumft
where sumft = zipWith (+) fibs tfi
tfi = tail fibs
Run Code Online (Sandbox Code Playgroud)
然后,“开始步骤”是
??? tfi ?????????··
fibs:[1、1,?,?,...
??? sumft ????··
tfi:[1,?,?,?,...
sumft:[2,?,?,?,
现在,随着计算的进行,运行时不会移动任何东西,它只是尝试?用具体值填充符号。请记住,Haskell中的所有内容都是不可变的。当我写的时候,?我只是说我不知道它的值是什么,但是原则上它已经预先确定了。
在这种情况下,运行时知道第一个?输入fibs来自的头部sumft,现在确切的值已经知道:
???? tfi ????????··
fibs:[ 1、2,?,...
??? sumft ????··
tfi:[1,?,?,?,...
sumft:[ 2,?,?,?,
现在,这2也被称为tfi:
???? tfi ????????··
fibs:[ 1、2,?,...
??? sumft ????··
tfi:[ 1、2,?,?,...
sumft:[2,?,?,?,
...因此我们可以执行下一个添加:
???? tfi ????????··
小谎:1,1?2,...
??? sumft ????··
tfi:[ 1、2,?,?,...
sumft:[2,3,?,?,
所以,另一种数量,即的另一个元件sumft是,为的一部分fibs,也可在此使用。但是,相对于-的头部,sumft它仍然出现在同一位置,即在2。
???? tfi ????????··
fibs:[ 1、2、3,...
??? sumft ????··
tfi:[1、2,?,?,...
sumft:[2,3,?,?,
再次用于 tfi
???? tfi ????????··
fibs:[ 1、2、3,...
??? sumft ????··
tfi:[ 1、2、3,?,...
摘要:[2,3,?,?,
...等等等等。