Поскольку строки являются списками в Haskell, вы также можете спросить, почему списки не находятся в Enum
, так как вы не сможете написать экземпляр только для строк без расширений. Но это не имеет значения. Проблема в том, что перечисление в лексикографическом порядке не очень полезно, так как вы просто продолжаете добавлять наименьший символ в конце на неопределенный срок.
Использование алфавита a..z
для простоты, лексикографический порядок просто дает нам повторения первой буквы.
"", "a", "aa", "aaa", "aaaa", "aaaaa" ...
Более полезный порядок перечисления строк по длине. Таким образом, мы получаем первую пустую строку, то все строки длиной 1, то все длины 2, и т.д.
"", "a", "b", ... "z", "aa", "ba", ... "za", "ab", ... "zz", "aaa", "baa" ...
Это, по существу, такой же, как с перечислением чисел, с обратной цифры, поэтому, когда вы добраться до "zz"
вы носите и получить "aaa"
, точно так же как, как вы получите от 99 до 100.
Однако, это было бы несовместимо с Ord
например, для списков, которые используют лексикографический порядок.
На самом деле, я могу думать о многих строках между «а» и «аа». Там есть «a_» и «a__», «a____» и «a______» ... ad infinitum. («_» должно быть пробелом, кстати) – Ord
Точка взята. Но см. Edit - «a» ++ [minBound :: Char] - который является «a \ NULL» - это> «a» и <любой из этих примеров – gcbenison
Экземпляр «Enum», который вы предлагаете, не полезен , Перечисление, начинающееся с заданного значения, приведет к созданию потока более длинных строк символов «\ NULL», и не может быть предложен экземпляр «Enum», который полезен по той же причине, что реальные числа не рекурсивно перечислимы. –