Как Haskell упорядочивает строки и когда эта функциональность будет полезна?
Во-первых, Char является экземпляром Ord, заданным примитивами равенства для базового типа примитивов на машине.
instance Ord Char where
(C# c1) > (C# c2) = c1 `gtChar#` c2
(C# c1) >= (C# c2) = c1 `geChar#` c2
(C# c1) <= (C# c2) = c1 `leChar#` c2
(C# c1) < (C# c2) = c1 `ltChar#` c2
тогда String определяется как [Char]
(список символов), и списки обычно имеют порядок, если их элементы имеют порядок:
instance (Ord a) => Ord [a] where
compare [] [] = EQ
compare [] (_:_) = LT
compare (_:_) [] = GT
compare (x:xs) (y:ys) = case compare x y of
EQ -> compare xs ys
other -> other
и все. Любой список, элементы которого имеют порядок, будет, в свою очередь, упорядочен.
Поскольку Char упорядочен по своему базовому представлению в виде битового шаблона, а списки задаются поэтапным упорядочением списков, вы, таким образом, видите поведение для String.
когда эта функция будет полезна?
Для вставки строк в структуры данных, которые являются полиморфными, но требуют метода упорядочения. Наиболее заметными являются Set и Map .