Шаг 75.
Основы языка Haskell.
Функции обработки списков. Элементарные конструкторы

    На этом шаге мы перечислим эти функции.

    Перечислим несколько таких функций.

    1. Функция, возвращающая список, составленный из заданного элемента, повторенного указанное количество раз:

   replicate:: Int -> a -> [a]
   replicate n x
Например:
   > replicate 0 2   > replicate 2 1   > replicate 3 [1,-2]
   []                [1,1]             [[1,-2],[1,-2],[1,-2]]

   > replicate 3 'a'
   "aaa"

    2. Функция, конструирующая конечный список элементов (образующих арифметическую прогрессию с разностью 1) по двум заданным, являющихся границами списка:

   numericEnumFromTo:: Real a => a -> a -> [a]
   numericEnumFromTo m n
Например:
   > numericEnumFromTo 3 10
   [3,4,5,6,7,8,9,10]


   Замечание. В версии интерпретатора Haskell (май,2006) имя функции следующее:
   enumFromTo m n
Например:
   > enumFromTo 1 11
   [1,2,3,4,5,6,7,8,9,10,11]

    3. Функция, конструирующая конечный список элементов (образующих арифметическую прогрессию с разностью, определяемую двумя начальными положительными значениями) до заданного элемента, являющегося третьим аргументом функции:

   numericEnumFromThenTo:: Real a => a -> a -> a -> [a]
   numericEnumFromThenTo  2m n k
Например:
   > numericEnumFromTo 1 4 28
   [1,4,7,10,13,16,19,22,25,28]


   Замечание. В версии интерпретатора Haskell (май,2006) имя функции таково:
   enumFromThenTo m n k
Например:
   > enumFromThenTo 3 10 31
   [3,10,17,24,31]

    4. Функция, разделяющая исходный список на два и возвращающая пару из полученных списков. Точкой деления исходного списка является указанное число элементов, которые следует разместить в первом выходном списке:

   splitAt:: Int -> [a] -> ([a],[a])
   splitAt n lst
Например:
   > splitAt 0 [1,2,3,4,5]   > splitAt 2 [[1,2],[3],[-4,-5,4]]
   ([],[1,2,3,4,5])          ([[1,2],[3]],[-4,-5,4])

   > splitAt 5 [[1,2],[3]]
   ([[1,2],[3]],[])

    5. Функция, формирующая по двум заданным спискам список пар, образованных из соответствующих элементов исходных списков:

   zip:: [a] -> [b] -> [(a,b)]
   zip lst1 lst2
Если списки имеют разную длину, то длина результирующего списка равна длине наиболее короткого списка. Например:
   > zip [] []   > zip [1,-2] [-5,3]   > zip [1,2,3,4] [-1,-2,-3]
   []            [(1,-5),(-2,3)]       [(1,-1),(2,-2),(3,-3)]

   > zip [-1,-3,-5,-7,-9,-11,-13,-15] [-2,-4,-6,-8,-10]
   [(-1,-2),(-3,-4),(-5,-6),(-7,-8),(-9,-10)]

    6. Функция, формирующая по трём заданным спискам список троек, образованных из соответствующих элементов исходных списков:

   zip3:: [a] -> [b] -> [c] -> [(a,b,c)]
   zip3 lst1 lst2 lst3
Если списки имеют разную длину, то длина результирующего списка будет равна длине наиболее короткого списка. Например:
   > zip3 [] [] []   > zip3 [1,4] [2,5] [3,6]
   []                [(1,2,3),(4,5,6)]

   > zip3 [1,2,3,4] [-1,-2,-3]
   [(1,-1),(2,-2),(3,-3)]

   > zip3 [-1,-2,-3,-4,-5] [1,2,3,4,5,6] [11,22,33,44]
   [(-1,1,11),(-2,2,22),(-3,3,33),(-4,4,44)]

    7. Функция, преобразующая список пар в пару списков:

   unzip:: [(a,b)] -> ([a],[b])
   unzip lstPair
Например:
    > unzip [(1,-5),(-2,3)]   > unzip [(1,-1),(2,-2),(3,-3)]
   ([1,-2],[-5,3])            ([1,2,3],[-1,-2,-3])

   > unzip [(-1,-2),(-3,-4),(-5,-6),(-7,-8),(-9,-10)]
   ([-1,-3,-5,-7,-9],[-2,-4,-6,-8,-10])

    8. Функция, преобразующая список троек в тройку списков:

   unzip3:: [(a,b,c)] -> ([a],[b],[c])
   unzip3 lstThree
Например:
   > unzip3 [(1,2,3),(4,5,6)]
   ([1,4],[2,5],[3,6])

   > unzip3 [(1,-1,11),(2,-2,22),(3,-3,33)]
   ([1,2,3], [-1,-2,-3], [11,22,33])

   > unzip3 [(-1,1,11),(-2,2,22),(-3,3,33),(-4,4,44)]
   ([-1,-2,-3,-4],[1,2,3,4],[11,22,33,44])

    На следующем шаге мы рассмотрим элементарные преобразователи на строках.




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