или
>/=
внутри своего определения. Все типы, которые мы упоминали выше, за исключением функций, входят в класс
>Eq
, и, следовательно, могут быть проверены на равенство.
>ghci> 5 == 5
>True
>ghci> 5 /= 5
>False
>ghci> 'a' == 'a'
>True
>ghci> "Хо Хо" == "Хо Хо"
>True
>ghci> 3.432 == 3.432
>True
Класс >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
, и представляет его в виде строки.
>ghci> show 3
>"3"
>ghci> show 5.334
>"5.334"
>ghci> show True
>"True"
Класс >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