首先,我们将表示一个Stream
这样的:
a1 a2 a3 a4 a5 ...
现在,让我们来定义ruler
分开:
ruler :: Stream Integer
ruler = streamInterleave (streamRepeat 0) (streamMap (+1) ruler)
在 Haskell 中,很重要的一点是懒惰。也就是说,在需要评估之前,不需要评估东西。这在这里很重要:这就是使这个无限递归定义起作用的原因。那么我们如何理解这一点呢?我们将从streamRepeat 0
位开始:
0 0 0 0 0 0 0 0 0 ...
然后将其馈入 a ,它与来自(用s表示streamInterleave
)的(尚未知的)流交错:streamMap (+1) ruler
x
0 x 0 x 0 x 0 x 0 x 0 x ...
现在我们将开始填写那些x
s。我们已经知道ruler
is0
的每个第二个元素,所以streamMap (+1) ruler
must的每个第二个元素1
:
1 x 1 x 1 x 1 x 1 x ... <--- the elements of (streamMap (+1) ruler)
0 1 0 x 0 1 0 x 0 1 0 x 0 1 0 x 0 1 0 x ... <--- the elements of ruler
现在我们知道每组四个中的第二个元素(所以数字 2,6,10,14,18,...)是1
,所以对应的元素streamMap (+1) ruler
必须是2
:
1 2 1 x 1 2 1 x 1 2 ... <--- the elements of (streamMap (+1) ruler)
0 1 0 2 0 1 0 x 0 1 0 2 0 1 0 x 0 1 0 2 ... <--- the elements of ruler
现在我们知道,每组八中的每第四个元素(所以数字 4,12,20,...)是2
这样对应的元素streamMap (+1) ruler
must 是3
:
1 2 1 3 1 2 1 x 1 2 ... <--- the elements of (streamMap (+1) ruler)
0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 x 0 1 0 2 ... <--- the elements of ruler
我们可以ruler
像这样无限n/2, 3n/2, 5n/2, ...
地继续构建,将 的每个编号的值替换回去ruler
。