Подтвердить что ты не робот

В Haskell, где диапазон ['a'..] останавливается?

Я изучаю Haskell для удовольствия, следуя Учите вас Haskell. Диапазон может быть до бесконечности с числами при использовании [1..]. С символами, где заканчивается диапазон ['a'..]? Я предполагаю, что последний символ таблицы Unicode, но я ничего не знаю о Haskell, поэтому просто спрашиваю!

4b9b3361

Ответ 1

Из Haskell Report 2010:

Тип символа 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..] займет примерно навсегда.