Генерация бесконечной последовательности в Хаскеле
Я знаю, что в 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).