Я изучаю Haskell для удовольствия, следуя Учите вас Haskell. Диапазон может быть до бесконечности с числами при использовании [1..]
. С символами, где заканчивается диапазон ['a'..]
? Я предполагаю, что последний символ таблицы Unicode, но я ничего не знаю о Haskell, поэтому просто спрашиваю!
В Haskell, где диапазон ['a'..] останавливается?
Ответ 1
Тип символа Char - это перечисление, значения которого представляют Юникод. Тип Char - это экземпляр классов Read, Show, Eq, Ord, Enum и Bounded.
Таким образом, теоретически этот диапазон должен останавливаться на последнем символе, определенном в стандарте Unicode (хотя он не указал, какая версия). На практике ваша реализация Haskell может отличаться, например. GHCI 7.6.2 останавливается на\1114111.
Ответ 2
Если вы хотите знать, где находится диапазон, просто получите последний элемент...
ghci> last ['a'.. ]
'\1114111'
Другой метод: Char
- ограниченный тип, т.е. тип с минимальными и максимальными значениями. Типы в классе Bounded
предоставляют значение maxBound
. Поскольку maxBound
является полиморфным, вы должны явно указать тип значения, которое вы ищете.
ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807
Нет maxBound
для Integer
, поскольку они неограничены.
Презентация Haskell объясняет связь между ['a'..]
и maxBound
. Обозначение ['a'..]
является синтаксическим сахаром для enumFrom a
; здесь enumFrom
- метод класса типа Enum
. Документация Enum
указывает, что, когда тип также является экземпляром Bounded
, enumFrom x
должен быть эквивалентен enumFromTo x maxBound
или более читаемо, [x..] = [x..maxBound]
. Поэтому последний элемент ['a'..]
должен быть таким же, как maxBound :: Char
.
last ['a'.. ]
выполняет итерацию по списку, но современный компьютер может подсчитать до миллиона в глазном знаке. Это не то, что вы хотели бы установить в узкой петле, но как-то вы запускаете только один раз, когда это не большая нагрузка. Если вы попробуете это в менее оптимизированной реализации, такой как Hugs вместо GHC, вам может потребоваться дождаться результата. Напротив, last [0..]
займет примерно навсегда.