Построение бесконечного списка в Хаскеле

У меня есть две вещи для желаемого бесконечного списка: его первый элемент

x :: A

и функция, которая генерирует следующий элемент

f :: [A] -> A

Какой лучший (самый идиоматичный? Самый быстрый?) Способ создать бесконечный список? Я имею в виду

xs = x : f [x] : f [x, f [x]] : f [x, f [x], f [x, f [x]]] : ...

2 ответа

Решение

Функция, которую вы хотите, может быть реализована как:

constructInf :: ([a] -> a) -> a -> [a]
constructInf f x = xs
  where xs = x:map f (tail $ inits xs)

Производительность consrtuctInf зависит от производительности его функции аргумента f, Если предположить, f занимает O(N) время, затем constructInf займет время O(M*N), где M - количество элементов из результата constructInf что вы будете проверять.

Ты хочешь iterate,

take 10 $ iterate (+1) 0

= [0,1,2,3,4,5,6,7,8,9]

Если вам нужен весь список до сих пор, и вы не против перевернуть его, вы можете сделать это:

mkl f x0 = x0 : unfoldr (\xs -> let x = f xs in Just (x, x:xs)) [x0]

Если вам пока нужен весь список, и вы хотите, чтобы он был в порядке, он будет действительно неэффективным, но вы можете сделать это:

mkl' f x0 = x0 : unfoldr (\xs -> let x = f xs in Just (x, xs ++ [x])) [x0]

Но я не уверен, зачем вам нужен весь список, а не только последний элемент.

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