Шаг 67.
Основы языка Haskell. Список как фундаментальный тип данных. Конструирование конечных списков с помощью двух точек ".."

    На этом шаге мы рассмотрим использование этой операции.

    В языке Haskell существует синтаксический сахар, позволяющий кратко записывать списки с помощью двух точек "..".

Определение (П.Ландин).
Синтаксическим сахаром иногда называют особые синтаксические формы (способ записи синтаксических конструкций языка программирования), которые представляют собой просто удобное альтернативное поверхностное представление для того, что можно выразить более унифицированным способом.

    Другими словами, синтаксический сахар - это маленькие особенности, нарушающие основные правила языка, чтобы сделать его более дружественным по отношению к программисту.

    По словам А.Перлиса, "синтаксический сахар вызывает рак точки с запятой".

    Комбинация символов .. является зарезервированной последовательностью символов языка Haskell и используется так: при задании конечного списка указывается первый и последний элемент одного и того же типа данных:

   [a..z]

    При задании конечного списка, моделирующего конечную арифметическую прогрессию (подобные списки иногда называются арифметическими последовательностями), разность прогрессии определяется при помощи указания первого и второго элементов последовательности:

   [a,b..z].

    При отсутствии указания второго элемента последовательности разность задаваемой арифметической последовательности равна 1.


    Примеры задания конечных списков.
   1. [1..100]   - список натуральных чисел от 1 до 100.
   2. [2,4..100] - список чётных натуральных чисел от 1 до 100.
   3. [2.6..6.0] - список чисел [2.6,3.6,4.6,5.6].

    Отметим, что указание числовых интервалов позволяет задавать только список чисел, поэтому в языке Haskell существует возможность создавать списки, моделирующие конечные математические последовательности.

    Приведем пример списков различных типов.

   -- Демонстрация постоянных функций, значениями
   -- которых являются списки различных типов
   ------------------------------------------
   -- (1) Список целых чисел
   -------------------------
   list1:: [Int]
   list1 = [1,2,3,4,1,4] 
   ------------------------------
   -- (2) Список булевых значений
   ------------------------------
   list2:: [Bool]
   list2 = [True,False,True]        
   -------------------------
   -- (3) Список символов
   ----------------------
   list3:: [Char]
   list3 = ['s','t','r','i','n','g'] 
   ---------------------------------
   -- (4) Строка как список символов
   ---------------------------------
   list4:: [Char]
   list4 = "string"         
   ---------------------------------------------------------
   -- (5) Список целых чисел в диапазоне от 2 до 7 с шагом 1
   ---------------------------------------------------------
   list5:: [Int]
   list5 = [2..7]           -- [2,3,4,5,6,7]
   ---------------------------------------------------------
   -- (6) Список целых чисел в диапазоне от 7 до 3 с шагом 1
   ---------------------------------------------------------
   list6:: [Int]
   list6 = [7,6..3]         -- [7,6,5,4,3]
   ----------------------------------------------------------
   -- (7) Список вещественных чисел в диапазоне от 3.1 до 7.0
   --     с шагом 1 
   ----------------
   list7:: [Float]
   list7 = [3.1..7.0]       -- [3.1,4.1,5.1,6.1,7.1]
   ----------------------------------------------------------
   -- (8) Список вещественных чисел в диапазоне от 0.0 до 1.0
   --     с шагом 0.3
   ------------------
   list8:: [Float]
   list8 = [0.0,0.3..1.0]   -- [0.0,0.3,0.6,0.9]
   ---------------------------------------------
   -- (9) Список числовых списков
   ------------------------------
   list9:: [[Int]]
   list9 = [[12,2],[2,12],[],[-1,-7,-3],[10]] 
Файл с примерами можно взять здесь.


   Замечание (для знатоков). Выражение [x..y] вычисляется с помощью вызова функции
   enumFromTo:: Int -> Int -> [Int]
   enumFromTo x y | y<x  = []
                  | True = x : enumFromTo (x+1) y

    На следующем шаге мы рассмотрим операции над списками.




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