52700.fb2
к комплексным числам мы теряем способность сравнения на больше/меньше, но сохраняем возможность
вычисления арифметических операций, поэтому класс Real это пересечение классов Num и Ord:
Prelude> :i Real
class (Num a, Ord a) => Real a where
toRational :: a -> Rational
Здесь “пересечение” означает “и тот и другой”. Пересечение классов кодируется с помощью контекста.
Вернёмся к нашему первому примеру:
36 | Глава 2: Первая программа
Prelude> realToFrac (1::Float) + (1::Double)
2.0
Отметим, что этой функцией можно пользоваться не только для типов Float и Double, в Haskell возможны
самые экзотические числа.
Если преобразования между Float и Double происходят очень-очень часто, возможно имеет смысл вос-
пользоваться специальными для GHC функциями: Они определены в модуле GHC.Float:
Prelude> :m +GHC.Float
Prelude GHC.Float> :t float2Double
float2Double :: Float -> Double
Prelude GHC.Float> :t double2float
double2Float :: Double -> Float
2.7 Документация
К этой главе мы уже рассмотрели основные конструкции языка и базовые типы. Если у вас есть какая-то
задача, вы уже можете начать её решать. Для этого сначала нужно будет описать в типах проблему, затем
выразить с помощью функций её решение.
Но не стоит писать все функции самостоятельно, если функция достаточно общая её наверняка кто-
нибудь уже написал. Самые полезные функции и классы определены в модуле Prelude и основных стан-
дартных библиотечных модулях. Было бы излишним описывать каждую функцию, книга превратилась бы
в справочник. Вместо этого давайте научимся искать функции в документации. Нам понадобится умение
составлять типы функций и небольшое знание английского языка.
Для начала о том, где находится документация к стандартным модулям. Если вы установили ghc вме-
сте с Haskell Platform под Windows скорее всего во вкладке Пуск, там где иконка ghc там же находится
и документация. В Linux необходимо найти директорию с документацией, скорее всего она в директории
/usr/local/share/doc/ghc/libraries. Также документацию можно найти в интернете, наберите в поиско-
вике Haskell Hierarchical Libraries. На главной странице документации вы найдёте огромное количество мо-
дулей. Нас пока интересуют разделы Data и Prelude. Разделы расположены по алфавиту. То что вы видите
это стандартный вид документации в Haskell. Документация делается с помощью специального приложе-
ния Haddock, мы тоже научимся такие делать, но позже, пока мы попробуем разобраться с тем как искать в
документации функции.
Предположим нам нужно вычислить длину списка. Нам нужна функция, которая принимает список и
возвращает целое число, скорее всего её тип [a] -> Int, обычно во всех библиотечных функциях для це-
лых чисел используется тип Int, также на месте параметра используются буквы a, b, c. Мы можем открыть
документацию к Prelude набрать в строке поиска тип [a] -> Int. Или поискать такую функцию в разде-
ле функций для списков List Operations. Тогда мы увидим единственную функцию с таким типом, под
говорящим именем length. Так мы нашли то, что искали.
Или мы ищем функцию, которая переворачивает список, нам нужна функция с типом [a] -> [a]. Таких
функций в Prelude несколько, но имя reverse одной из них может намекнуть на её смысл.
Но одной Prelude мир стандартных функций Haskell не ограничивается, если вы не нашли необходимую
вам функцию в Prelude её стоит поискать в других библиотечных модулях. Обычно функции разделяются
по тому на каких типах они определены. Так например функция sort :: Ord a => [a] -> [a] определена
не в Prelude, а в отдельном библиотечном модуле для списков он называется Data.List. Так же есть много