52700.fb2
= \x -> x
const a = \_ -> a
• Функции, которые комбинируют функции или функции и значения:
f . g
= \x -> f (g x)
f $ x
= f x
(.*. ) ‘on‘ f = \x y -> f x .*. f y
• Преобразователи функций, принимают функцию и возвращают функцию:
flip f = \x y -> f y x
• Комбинатор неподвижной точки:
fix f = let x = f x
in
x
Приоритет инфиксных операций
Мы узнали о специальном синтаксисе для задания приоритета применения функций в инфиксной форме:
infixl 3 #
infixr 6 ‘op‘
Приоритет складывается из двух частей: старшинства (от 1 до 9) и ассоциативности (бывает левая и
правая). Старшинство определяет распределение скобок между разными функциями:
infixl 6 +
infixl 7 *
1 + 2 * 3 == 1 + (2 * 3)
А ассоциативность – между одинаковыми:
infixl 6 +
infixr 8 ^
1 + 2 + 3 == (1 + 2) + 3
1 ^ 2 ^ 3 ==
1 ^ (2 ^ 3)
Мы узнали, что функции ($) и (. ) стоят на разных концах шкалы приоритетов функций и как этим
пользоваться.
5.7 Упражнения
• Просмотрите написанные вами функции, или функции из примеров. Можно ли их переписать с по-
мощью основных функций высшего порядка? Если да, то перепишите. Попробуйте определить их в
бесточечном стиле.
• В прошлой главе у нас было упражнение о потоках. Сделайте поток экземпляром класса Num. Для этого
поток должен содержать значения из класса Num. Методы из класса Num применяются поэлементно. Так
сложение двух потоков будет выглядеть так:
(a1 :& a2 :& a3 :& ... ) + (b1 :& b2 :& b3) ==
==
(a1 + b1 :& a2 + b2 :& a3 + b3 :& ... )
84 | Глава 5: Функции высшего порядка
• Определите приоритет инфиксной операции (:& )
так чтобы вам было удобно использовать её в сочетании с арифметическими операциями.
• Рассмотрим такой тип:
data St a b = St (a -> (b, St a b))
Этот тип хранит функцию, которая позволяет преобразовывать потоки значений. Определите функцию
применения:
ap :: St a b -> [a] -> [b]