ns :: [Integer]
ns = 0 : [n+k | (n, k) <- zip ns [1,3..]]
这是一个核心数据定义。 ns
是一个常量,一个列表,但由于Haskell是懒惰的,因此它被访问“充实”。
一个例证:
1 n1 n2 n3 n4 n5 ... -- the list ns, [n1,n2,n3,...],
2 0 1 4 ... -- starts with 0
3 -----------------
4 1 3 5 7 9 -- [1,3..]
5 -----------------
6 1 4 ... -- sum the lines 2 and 4 pairwise, from left to right, and
7 n2 n3 n4 n5 ... -- store the results starting at (tail ns), i.e. from n2
我们可以看到,正是如何访问迫使列表ns
进入存在有步骤,例如print $ take 4 ns
后,通过命名临时实体:
ns :: [Integer]
ns = 0 : [n+k | (n, k) <- zip ns [1,3..]]
ns = 0 : tail1
tail1 = [n+k | (n, k) <- zip ns [1,3..]]
= [n+k | (n, k) <- zip (0 : tail1) [1,3..]]
= [n+k | (n, k) <- (0,1) : zip tail1 [3,5..]]
= 1 : [n+k | (n, k) <- zip tail1 [3,5..]]
= 1 : tail2
tail2 = [n+k | (n, k) <- zip (1 : tail2) [3,5..]]
= [n+k | (n, k) <- (1,3) : zip tail2 [5,7..]]
= 4 : tail3
tail3 = [n+k | (n, k) <- zip (4 : tail3) [5,7..]]
= 9 : tail4
tail4 = [n+k | (n, k) <- zip (9 : tail4) [7,9..]]
------
ns = 0 : 1 : 4 : 9 : tail4
'ns'是恒定的,它是一个不带参数的函数,它是纯的,所以它的值恰好取决于0个参数的值。 0个参数可以精确地具有0个唯一值;也就是说,它的价值取决于什么。 “常量”并不意味着“评估微不足道”或“有限”或类似的东西。 'ns'中发生的事情与'x = 1:x'中发生的事情是一样的。显而易见的是,'x'的第一个值是1,很明显x的下一个值是x的第一个值,它是1,其后的下一个值是x的第一个值。等等。 – user2407038
没有参数为零的函数,所有函数都有一个参数。 – augustss