Шаг 103.
Основы языка Haskell. Функционалы (функции высшего порядка). Функционалы из Prelude. Функционалы-конструкторы

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

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

    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]

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




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