На этом шаге мы перечислим эти функции.
Перечислим несколько таких функций.
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]
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]
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])
На следующем шаге мы рассмотрим элементарные преобразователи на строках.