Во-первых, мы представим Stream
, например:
a1 a2 a3 a4 a5 ...
Теперь давайте разберем определение ruler
:
ruler :: Stream Integer
ruler = streamInterleave (streamRepeat 0) (streamMap (+1) ruler)
В Хаскеле важным моментом является лень; то есть вещи не нужно оценивать, пока они не должны быть. Это важно здесь: именно это делает это бесконечно рекурсивное определение работоспособным. Итак, как мы понимаем это? Начнем с бита streamRepeat 0
:
0 0 0 0 0 0 0 0 0 ...
Затем это подается в streamInterleave
, который чередует этот поток с (пока неизвестным) потоком из streamMap (+1) ruler
(представлен x
s):
0 x 0 x 0 x 0 x 0 x 0 x ...
Теперь мы начнем заполнять эти x
s. Мы уже знаем, что каждый второй элемент ruler
равен 0
, поэтому каждый второй элемент streamMap (+1) ruler
должен быть 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
должны быть 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
.