2013-11-03 3 views
4

Я видел этот код для генерации чисел Фибоначчи.Haskell как создать этот бесконечный список?

fibs = 1:1:(zipWith (+) fibs (tail fibs))

Может подобный стилизованный код записывается, чтобы генерировать бесконечный список [1 ..]?

Я видел это link on cyclic structures на сайте Haskell.

Там приведен пример

cyclic = let x = 0 : y 
     y = 1 : x 
    in x 

Я попытался создать список для моей проблемы в циклическом порядке, но не смог добиться успеха. Что я хочу - это список, определенный в терминах самого себя и который оценивается в [1 ..] в Hasekll.

Примечание: Haskell [1..] оценивает по: [1,2,3,4,5...], а не [1,1,1...].

+0

'ones = 1: ones' –

+0

Это не то же самое, что' [1 ..] 'в Haskell. Haskell '[1 ..]' оценивает '[1,2,3,4,5 ...]', в то время как ваш оценивает '[1,1,1,1 ...]'. –

+0

А, ок. 'nats = 1: map (+1) nats' then. –

ответ

8

Следующие должен дать вам желаемый результат:

nats = 1 : map (+1) nats 

Или, идиоматический:

nats = iterate (+1) 1 

Это легко понять, почему первый фрагмент вычисляет [1,2,3...] с помощью эквациональной рассуждении:

nats = 1 : map (+1) nats 
    = 1 : map (+1) (1 : map (+1) nats) 
    = 1 : map (+1) (1 : map (+1) (1 : map (+1) nats)) 
    = 1 : 1 + 1 : 1 + 1 + 1 : .... 
    = [1,2,3...] 
+0

' nats = iterate succ 1' дает еще лучшую интуицию для того, что происходит, на мой взгляд. Естественно, применение функции-преемника приведет к набору натуральных чисел. – kqr

+0

@kqr: Если вы начинаете с нуля, то есть! – yatima2975

5

Да.

Подумайте о том, как вы могли бы выписать каждый элемент в списке:

1 
1 + 1 
1 + 1 + 1 
1 + 1 + 1 + 1 
1 + 1 + 1 + 1 + 1 

После каждой записи, каждая последующая запись имеет дополнительный + 1. Поэтому мы хотим начать с 1, а затем добавить 1 к каждому последующему элементу. Затем мы хотим взять второй элемент и добавить 1 ко всему после этого.

Вот как мы можем это сделать:

let xs = 1 : map (+ 1) xs 

Это расширяет как это:

1 : map (+ 1) xs 
1 : (1 + 1) : map (+ 1) xs 
1 : (1 + 1) : ((1 + 1) + 1) : map (+ 1) xs 

и так далее.

Смежные вопросы