这个函数发生了什么(haskell)?

use*_*212 4 haskell list-comprehension list

我有这个haskell功能,我不太明白.

ns :: [Integer]
ns = 0 : [n+k | (n, k) <- zip ns [1,3..]]
Run Code Online (Sandbox Code Playgroud)

我被要求"需要3 ns".

我认为ns是常量所以它只会用列表的第一个元素压缩,给出(0,1).然后当添加时给出1的答案.然后它说"需要3 ns",所以我用列表的前5个元素压缩0,给出...(0,1),(0,3),(0,5 )然后在添加时,我得到[1,3,5]的最终答案.然而,这不是正确的答案.

ns真正发生了什么?我很难理解......

Die*_*lan 7

haskell很懒,所以你可以有递归定义.在这里布局.

ns = 0 : something

(n,k) <- zip (0 : something ) [1,3,5,7...]
(n,k) <- [(0,1) : something )

ns = 0 : 1 : something

(n,k) <- zip ( 0 : 1 : something ) [3,5,7...]
(n,k) <- (0,1) : (1,3) : something

ns = 0 : 1 : 4 : something

(n,k) <- zip ( 0 : 1 : 4 : something ) [5,7...]
(n,k) <- (0,1) : (1,3) : (4,5) : something

ns = 0 : 1 : 4 : 9 : something

....
Run Code Online (Sandbox Code Playgroud)

看看我们如何确定下一个元组是什么然后添加它的两个元素.这允许我们确定下一个元素.