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

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

=>

abs $ \x -> (x * 2) - 10

-- по определению (-) для функций

=>

\x -> abs x . \x -> (x * 2) - 10

-- по определению abs для функций

=>

\x -> abs ((x * 2) - 10)

-- по определению (.)

=>

\x -> abs ((x * 2) - 10)

Функция возведения в квадрат:

*FunNat> let f = id * id

*FunNat> map f [1,2,3,4,5]

[1,4,9,16,25]

*FunNat> map (id * id - 1) [1,2,3,4,5]

[0,3,8,15,24]

Обратите внимание на краткость записи. В этом выражении (id * id - 1) проявляется основное пре-

имущество бесточечного стиля, избавившись от аргументов, мы можем пользоваться функциями так, словно

это простые значения. Этот приём используется в Haskell очень активно. Пока нам встретились лишь две

инфиксных операции для функций (это композиция и применение с низким приоритетом), но в будущем вы

столкнётесь с целым морем подобных операций. Все они служат одной цели, они прячут аргументы функции,

позволяя быстро составлять функции на лету из примитивов. Чтобы не захлебнуться в этом море помните,

что скорее всего новый символ означает либо композицию либо применение для функций специального

вида.

Возведём в четвёртую степень:

80 | Глава 5: Функции высшего порядка

*FunNat> map (f . f) [1,2,3,4,5]

[1,16,81,256,625]

Составим функцию двух аргументов, которая будет вычислять сумму квадратов двух аргументов:

*FunNat> let x = const id

*FunNat> let y = flip $ const id

*FunNat> let d = x * x + y * y

*FunNat> d 1 2

5

*FunNat> d 3 2

13

Так мы составили функцию, ни прибегая к помощи аргументов. Эти выражения могут стать частью других

выражений:

*FunNat> filter

((< 10) . d 1) [1,2,3,4,5]

[1,2]

*FunNat> zipWith d [1,2,3] [3,2,1]

[10,8,10]

*FunNat> foldr (x*x - y*y) 0 [1,2,3,4]

3721610024

*FunNat> zipWith ((-) * (-) + const id) [1,2,3] [3,2,1]

[7,2,5]

В последнем выражении трудно предугадать результат. В таких выражениях всё-таки лучше пользоваться

синонимами. В бесточечном стиле мы можем несколькими операциями собрать из базовых функций сложную