На этом шаге мы рассмотрим функционалы этого типа.
Перечислим функционалы этой группы.
1. Функционал, применяющий бинарный оператор к начальному значению и к каждому последующему элементу заданного списка, формируя при этом список промежуточных результатов:
scanl:: (a -> b -> a) -> a -> [b] -> [a] scanl funct k lst
> scanl (+) 0 [1,2,3,4,5] > scanl (*) 2 [5,6,7] [0,1,3,6,10,15] [2,10,60,420] > scanl min (-5) [-1,2,-13,-4,-6] [-5,-5,-5,-13,-13,-13]
2. Функционал, применяющий бинарный оператор к голове заданного непустого списка и к каждому последующему его элементу, формируя при этом список промежуточных результатов:
scanl1:: (a -> a -> a) -> [a] -> [a] scanl1 funct lst
> scanl1 (+) [1,2,3,4,5] > scanl1 (*) [5,6,7] [1,3,6,10,15] [5,30,210] > scanl1 min [-1,2,-13,-4,-6] [-1,-1,-13,-13,-13]
3. Функционал, применяющий бинарный оператор к начальному значению и к каждому последующему элементу заданного списка. Полученный результат записывается в формируемый список. Далее бинарный оператор применяется к каждому последующему элементу хвоста списка.
Результат также записывается в список.
Процесс продолжается до тех пор, пока хвост списка не станет пустым; в этом случае возвращается исходное начальное значение:
scanr:: (a -> b -> b) -> b -> [a] -> [b] scanr funct k lst
> scanr (+) 0 [1,2,3,4,5] > scanr (*) 2 [5,6,7] [15,14,12,9,5,0] [420,84,14,2] > scanr min (-5) [-1,2,-13,-4,-6] > scanr (-) 0 [1,2,3,4,5] [-13,-13,-13,-6,-6,-5] [3,-2,4,-1,5,0]
4. Функционал, применяющий бинарный оператор к последнему элементу заданного непустого списка и к каждому последующему его элементу, начиная с предпоследующего. Полученный результат записывается в формируемый список. Далее бинарный оператор применяется к каждому последующему элементу хвоста списка.
Результат также записывается в список.
Процесс продолжается до тех пор, пока хвост списка не станет одноэлементным; в этом случае возвращается оставшийся элемент списка:
scanr1:: (a -> a -> a) -> [a] -> [a] scanr1 funct lst
> scanr1 (+) [1,2,3,4,5] > scanr1 (*) [5,6,7] [15,14,12,9,5] [210,42,7] > scanr1 min [-1,2,-13,-4,-6] [-13,-13,-13,-6,-6]
5. Функционал, возвращающий список элементов по двум исходным спискам путём применения заданной функции к парам соответствующих значений входных списков:
zipWith:: (a -> b -> c) -> [a] -> [b] -> [c] zipWith f lst1 lst2
> zipWith max [1,-2] [-5,3] > zipWith (+) [1,-2,10] [-5,3,10] [1,3] [-4,1,20] > zipWith (-) [1,-2,10] [-5,3,10,-3,-4,2] [6,-5,0]
На следующем шаге мы рассмотрим функционалы-распознаватели.