Поскольку
mystery = 0 : 10 : map (+1) mystery
по определениям (!!)
и (:)
и map
, это тот случай, когда
mystery !! 0 = 0 -- pseudocode
mystery !! 1 = 10
mystery !! n | n > 1
= (0 : 10 : map (+1) mystery) !! n
= (10 : map (+1) mystery) !! (n-1)
= (map (1+) mystery) !! (n-2)
= 1 + (mystery !! (n-2))
, и есть ваш ответ.
Иллюстрация:
-- 0 1 2 3 4 5 6 -- n
mystery = [0, 10, 1, 11, 2, 12, 3, ...
-- / / / / /
-- 0 1 2 3 4 -- n-2
-- [0, 10, 1, 11, 2, ...
так что все, что есть, - это каждый элемент, определенный со ссылкой на предыдущий, двумя позициями перед.
Таким образом, другой способ записать то же самое, сделав явное сопряжение (нет zipping ), - это
mystery = 0 : 10 : zipWith (+) mystery
(repeat 1)
Переведенный в императивный псевдокод, программа
main = print mystery
фактически совпадает с
main :
a = 0
b = 10
print "["
while( True ) :
print a ,
print b ,
a += 1
b += 1
A принципиальным подход к решению таких проблем - назвать все вашивременные лица.Тогда тайна исчезает:
mystery = 0 : 10 : map (+1) mystery
= x0 : t1
where
x0 = 0
t1 = 10 : map (+1) mystery
= x1 : t2
where
x1 = 10
t2 = map (+1) mystery
= map (+1) (x0 : t1)
= x0+1 : map (1+) t1
= x2 : t3
where
x2 = x0+1 = 0+1 = 1
t3 = map (1+) t1 = map (1+) (x1 : t2)
= x1+1 : map (1+) t2
= x3 : t4
where
....
Ни в коем случае мы не получим никакой функции, кроме функции (1+)
в этом процессе сокращения, или более одной из них.
Все, что мы получаем, это x<sub><b>n</b></sub> := 1 + x<sub><b>n-2</b></sub>
, многократно, для всех n
выше 1
.