Есть ли разница в том, как Data.Text
и Data.Vector.Unboxed Char
работают внутри? Почему я должен выбирать один за другим?
Я всегда думал, что это здорово, что Haskell определяет String
как [Char]
. Есть ли причина, что что-то аналогичное не было сделано для Text
и Vector Char
?
Конечно, было бы выгодно сделать их одинаковыми.... Инструменты Text-y и Vector-y можно было записать для использования в обоих лагерях. Представьте себе веревки интов или регулярные выражения на строках покерных карт.
Конечно, я понимаю, что, вероятно, были исторические причины, и я понимаю, что в большинстве современных библиотек используется Data.Text
, а не Vector Char
, поэтому есть много практических причин, чтобы поддержать друг друга. Но мне больше интересно узнать об абстрактных качествах, а не о текущем состоянии, в котором мы оказались. Если бы все было переписано завтра, было бы лучше объединить эти два?
Изменить, с дополнительной информацией -
Вставить материал в перспективу -
-
В соответствии с этой страницей http://www.haskell.org/haskellwiki/GHC/Memory_Footprint GHC использует 16 байт для каждого Char в вашей программе!
-
Data.Text не O (1) index'able, это O (n).
-
Веревки (двоичные деревья, обернутые вокруг текста) также могут содержать строки... У них лучшая сложность для индекса/вставки/удаления, хотя в зависимости от количества узлов и баланса дерева индекс может быть близок к тексту текста.
Это мой отход от этого -
-
Text
иVector Char
отличаются друг от друга.... -
Используйте String, если вам не нужна производительность.
-
Если производительность важна, по умолчанию используется текст.
-
Если требуется быстрое индексирование символов, и вы не против большого объема памяти (до 16 раз), используйте Vector Char.
-
Если вы хотите вставить/удалить много данных, используйте Ropes.