На этом шаге мы рассмотрим данный способ создания списков.
В языке Haskell существует возможность создавать списки с помощью двух точек "..", моделирующие потенциально бесконечные математические последовательности.
При задании потенциально бесконечного списка его последний элемент не указывается:
[a..]
При задании потенциально бесконечного списка, моделирующего бесконечную арифметическую прогрессию, разность прогрессии определяется при помощи указания первого и второго элементов:
[a,b..]
При отсутствии указания второго элемента списка моделируется арифметическая прогрессия, разность которой равна 1.
1. Потенциально бесконечный список натуральных чисел: [1..]. 2. Потенциально бесконечный список нечётных чисел : [1,3..].
Приведем демонстрационные примеры.
-- Демонстрация функции, возвращающей потенциально -- бесконечный список степеней числа n -- (первый способ) ----------------------------- step51:: Integer -> [Integer] step51 k = map (k^) [1..] -------------------------------------------------- -- Демонстрация функции, возвращающей потенциально -- бесконечный список степеней числа 5 -- (второй способ) -------------------------- step52 k = map step2 [1..] where step2 n | n==0 = 1 | True = stepQuick k n stepQuick n m | m==0 = 1 | m `rem` 2==0 = stepQuick (n*n) (m `div` 2) | True = n*stepQuick (n*n) ((m-1) `div` 2) ---------------------------------------------------------------- -- Неудачные тестовые примеры: ------------------------------------------------- test = take 750 (step51 5) == take 750 (step52 5)
Разумеется, понятно, что "бесконечность - это не порок", главное чтобы когда-нибудь при её использовании цепочка вычислений реально оборвалась.
На следующем шаге мы рассмотрим конструкторы потенциально бесконечных списков из библиотеки Prelude.