Меняет ли «итерация» значение применяемой функции? - PullRequest
2 голосов
/ 09 сентября 2011

Когда я помещаю следующее лямбда-выражение в ghci, я получаю 1:

ghci> (\x -> x+1) 0
1

Но когда я использую эту функцию с iterate, я получаю

ghci> take 10 (iterate (\x -> x+1) 0)
[0,1,2,3,4,5,6,7,8,9]

Я ожидал получить список, равный [1..10]. Почему нет?

Ответы [ 3 ]

10 голосов
/ 09 сентября 2011

Первым результатом итерации является исходный ввод без примененной функции, то есть функция вызывается 0 раз. Вот почему результат один от того, что вы ожидаете.

7 голосов
/ 09 сентября 2011

Точнее говоря, итерация реализована так:

iterate f v = v : iterate f (f v)

Просто помните, что начальное значение, которое вы даете для итерации, появится в списке первым - вот и все.

5 голосов
/ 09 сентября 2011

Стоп ... Hoogle time!

http://haskell.org/hoogle/?hoogle=iterate

нажмите iterate

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:iterate

iterate f x возвращает бесконечный список повторных заявлений от f до x:

 iterate f x == [x, f x, f (f x), ...]

Вот, пожалуйста.Это работает так, потому что так сказано.Я не пытаюсь быть легкомысленным, просто надеюсь проиллюстрировать полезность Hoogle и документов.(Звучит как хорошее название для группы на Хаскеле: «Hoogle and Docs»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...