52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 88

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 88

id

= \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]