Шаг 116.
Основы языка Haskell. Потенциально бесконечные списки. Конструирование потенциально бесконечных списков с помощью двух точек ".."

    На этом шаге мы рассмотрим данный способ создания списков.

    В языке 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.




Предыдущий шаг Содержание Следующий шаг