2009-11-23 4 views
2

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

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

generate::Integer->Integer 

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

ответ

14

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

iterate generate 1 

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

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

4

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

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

Эта функция принимает functon f и некоторые Valus s и возвращает s, после того, как она Wich называет себя с той же 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).

13

Добавление к ответу Матаджона: способ обнаружить функцию iterate, кроме просить здесь, будет использовать Hoogle.

Hoogle's first answer for the query(a -> a) -> [a] является iterate.

+2

+1 для распространения осведомленности Google. –

+0

+1 для ознакомления с Hoogle: D – Martin

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