Учебник по Haskell | страница 44



запятыми:

(a, b)

(a, b, c)

(a, b, c, d)

...

Классы

Show

Печать

Eq

Сравнение на равенство

Num

Сложение и умножение

Fractional

Деление

Особенности синтаксиса

Запись применения функции:

Префиксная

Инфиксная

add a b

a ‘add‘ b

(+) a b

a + b

Также мы научились приводить одни численные типы к другим и пользоваться документацией.

2.9 Упражнения

• Напишите функцию beside :: Nat -> Nat -> Bool, которая будет возвращать True только в том случае,

если два аргумента находятся рядом, то есть один из них можно получить через другой операцией Succ.

• Напишите функцию beside2 :: Nat -> Nat -> Bool, которая будет возвращать True только если

аргументы являются соседями через некоторое другое число.

• Мы написали очень неэффективную функцию сложения натуральных чисел. Проблема в том, что число

рекурсивных вызовов функции зависит от величины второго аргумента. Если мы захотим прибавить

единицу к сотне, то порядок следования аргументов существенно повлияет на скорость вычисления.

Напишите функцию, которая лишена этого недостатка.

• Напишите функцию возведения в степень pow :: Nat -> Nat -> Nat.

• Напишите тип, описывающий бинарные деревья BinTree a. Бинарное дерево может быть либо листом

со значением типа a, либо хранить два поддерева.

• Напишите функцию reverse :: BinTree a -> BinTree a, которая переворачивает дерево. Она меняет

местами два элемента в узле дерева.

• Напишите функцию depth :: BinTree a -> Nat, которая вычисляет глубину дерева, то есть самый

длинный путь от корня дерева к листу.

38 | Глава 2: Первая программа

• Напишите функцию leaves :: BinTree a -> [a], которая переводит бинарное дерево в список, воз-

вращая все элементы в листьях дерева.

• Обратите внимание на раздел List Operations в Prelude. Посмотрите на функции и их типы. Попро-

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

• Попробуйте разобраться по документации с классами Ord (сравнение на больше/меньше), Enum (пере-

числения) и Integral (целые числа). Также стоит отметить класс Floating. Если у вас не получится,

не беда, они обязательно встретятся нам вновь. Там и разберёмся.

• Найдите функцию, которая переставляет элементы пары местами (элементы могут быть разных типов).

Потренируйтесь с кортежами. Определите аналоги функций fst и snd для не пар. Обратите внимание

на то, что сочетание символов (,) это функция-конструктор пары:

Prelude> (,) ”Hi” 101

(”Hi”,101)

Prelude> :t (,)

(,) :: a -> b -> (a, b)

Также определены („), („,) и другие.

Упражнения | 39