Генерация бесконечной последовательности в Хаскеле

Я знаю, что в Haskell возможны бесконечные последовательности, однако я не совсем уверен, как их сгенерировать.

Учитывая метод

generate::Integer->Integer

который берет целое число и производит следующее целое число в последовательности, как бы я построить бесконечную последовательность из этого?

3 ответа

Решение

Если вы хотите, чтобы ваша последовательность начиналась с 1, то это -

iterate generate 1

Обратите внимание, что первая буква функции - строчная, а не прописная. В противном случае это будет тип данных, а не функция.

// edit: я только что понял, что не только типы данных начинаются с заглавной буквы, это может быть также конструктор данных или класс типов, но это не главное.:)

Добавление к ответу Матаджона: способ узнать iterate Функция, отличная от запрашиваемой здесь, будет использовать Google.

Первый ответ Google на запрос (a -> a) -> [a] является iterate,

Есть несколько способов сделать это, но один из них:

gen :: (a -> a) -> a -> [a]
gen f s = s : gen f (f s)

Эта функция принимает функцию f и некоторый валус s и возвращается s после того, что он называет себя тем же f и результат f s, Демонстрация:

Prelude> :t succ
succ :: (Enum a) => a -> a
Prelude> let gen f s = s : gen f (f s)
Prelude> take 10 $ gen succ 3
[3,4,5,6,7,8,9,10,11,12]

В приведенном выше примере succ действует как функция generate :: Integer -> Integer который вы упоминаете. Но заметьте, что gen будет работать с любой функцией типа a -> a,

Редактировать: и действительно, gen идентично функции iterate из прелюдии (и Data.List).

Другие вопросы по тегам