Изучай Haskell во имя добра! (Липовача) - страница 25

или >/= внутри своего определения. Все типы, которые мы упоминали выше, за исключением функций, входят в класс >Eq, и, следовательно, могут быть проверены на равенство.

>ghci> 5 == 5

>True

>ghci> 5 /= 5

>False

>ghci> 'a' == 'a'

>True

>ghci> "Хо Хо" == "Хо Хо"

>True

>ghci> 3.432 == 3.432

>True

Класс Ord

Класс >Ord предназначен для типов, которые поддерживают отношение порядка.

>ghci> :t (>)

>(>) :: (Ord a) => a –> a –> Bool

Все типы, упоминавшиеся ранее, за исключением функций, имеют экземпляры класса >Ord. Класс >Ord содержит все стандартные функции сравнения, такие как >>, ><, >>= и ><=. Функция >compare принимает два значения одного и того же типа, являющегося экземпляром класса >Ord, и возвращает значение типа >Ordering. Тип >Ordering может принимать значения >GT, >LT или >EQ, означая, соответственно, «больше чем», «меньше чем» и «равно».

>ghci> "Абракадабра" < "Зебра"

>True

>ghci> "Абракадабра" `compare` "Зебра"

>LT

>ghci> 5 >= 2

>True

>ghci> 5 `compare` 3

>GT

Класс Show

Значения, типы которых являются экземплярами класса типов >Show, могут быть представлены как строки. Все рассматривавшиеся до сих пор типы (кроме функций) являются экземплярами >Show. Наиболее часто используемая функция в классе типов >Show – это, собственно, функция >show. Она берёт значение, для типа которого определён экземпляр класса >Show, и представляет его в виде строки.

>ghci> show 3

>"3"

>ghci> show 5.334

>"5.334"

>ghci> show True

>"True"

Класс Read

Класс >Read – это нечто противоположное классу типов >Show. Функция >read принимает строку и возвращает значение, тип которого является экземпляром класса >Read.

>ghci> read "True" || False

>True

>ghci> read "8.2" + 3.8

>12.0

>ghci> read "5" – 2

>3

>ghci> read "[1,2,3,4]" ++ [3]

>[1,2,3,4,3]

Отлично. Но что случится, если попробовать вызвать >read>"4"?

>ghci> read "4"

>:1:0:

>    Ambiguous type variable `a' in the constraint:

>     `Read a' arising from a use of `read' at :1:0–7

>    Probable fix: add a type signature that fixes these type variable(s)

Интерпретатор GHCi пытается нам сказать, что он не знает, что именно мы хотим получить в результате. Заметьте: во время предыдущих вызовов функции >read мы что-то делали с результатом функции. Таким образом, интерпретатор GHCi мог вычислить, какой тип ответа из функции >read мы хотим получить.

Когда мы использовали результат как булево выражение, GHCi «понимал», что надо вернуть значение типа >Bool. А в данном случае он знает, что нам нужен некий тип, входящий в класс >Read, но не знает, какой именно. Давайте посмотрим на сигнатуру функции >read.

>ghci> :t read

>read :: (Read a) => String –> a