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

Data.Text vs String

В то время как общее мнение сообщества Haskell похоже, что всегда лучше использовать Text вместо String, тот факт, что все еще API-интерфейсы большинства поддерживаемых библиотек String -ориентирован, путает ад меня. С другой стороны, существуют заметные проекты, которые рассматривают String как ошибку в целом и обеспечивают Prelude со всеми экземплярами String -ориентированных функций, замененных с их Text -конвертерами.

Итак, есть ли какие-то причины для того, чтобы люди продолжали писать String -ориентированные API-интерфейсы, кроме обратной и стандартной совместимости с Prelude и "intertia-switch-making intertia"? Существуют ли какие-либо другие недостатки для Text по сравнению с String?

В частности, меня это интересует, потому что я разрабатываю библиотеку и пытаюсь решить, какой тип использовать для выражения сообщений об ошибках.

4b9b3361

Ответ 1

Моя безоговорочная догадка заключается в том, что большинство авторов библиотек не хотят добавлять больше зависимостей, чем необходимо. Поскольку строки являются частью буквально каждого дистрибутива Haskell (он является частью стандартного языка!), Гораздо проще получить усыновление, если вы используете строки и не требуете, чтобы ваши пользователи сортировали дистрибутивы Text из хака.

Это одна из тех "ошибок дизайна", с которой вам просто нужно жить, если вы не сможете убедить большую часть сообщества переключиться на ночь. Просто посмотрите, как долго это займет, чтобы стать аппликативным суперклассом Monad - относительно небольшим, но очень желательным изменением - и представьте, сколько времени потребуется, чтобы заменить все объекты String текстом.


Чтобы ответить на ваш более конкретный вопрос: я бы пошел со String, если вы не получите заметных преимуществ в производительности с помощью Text. Сообщения об ошибках обычно являются довольно маленькими одноразовыми вещами, поэтому не должно быть большой проблемой использовать String.

С другой стороны, если вы идеологический пурист, который избегает прагматизма для идеализма, идите с текстом.


* Я ошибаюсь в ошибках проектирования, потому что строки как список символов - это аккуратное свойство, которое позволяет им легко рассуждать и интегрироваться с другими существующими функциями для работы с списками.

Ответ 2

Если ваш API нацелен на обработку больших объемов персональных данных и/или различных кодировок, тогда ваш API должен использовать Текст.

Если ваш API в основном предназначен для небольших одиночных строк, то использование встроенного стиля String должно быть прекрасным.

Использование Строка для больших объемов текста сделает приложения, использующие ваш API, потреблять значительно больше памяти. Использование его с иностранными кодировками может серьезно осложнить использование в зависимости от того, как работает ваш API.

Строка довольно дорогая (не менее 5N слов, где N - число Char в String). Слово имеет такое же количество бит, что и процессорная архитектура (например, 32 бита или 64 бит): http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html

Ответ 3

В небольших проектах есть как минимум три причины использовать [ Char].

  • [Char] не полагается на любых тайных сотрудников, таких как внешние указатели, необработанная память, необработанные массивы и т.д., которые могут работать по-разному на разных платформах или даже вообще недоступны

  • [Char] - лингва-франка в хеккеле. Существует не менее трех "эффективных" способов обработки данных Unicode в haskell: utf8-bytestring, Data.Text.Text и Data.Vector.Unboxed.Vector Char, каждый из которых требует иметь дело с дополнительным пакетом.

  • используя [Char], вы получаете доступ ко всей мощности монады [], включая множество определенных функций (альтернативные пакеты с строкой пытаются помочь с ней, но все же)

Лично я считаю utf16 основанное на Data.Text одно из наиболее сомнительных предрассудков сообщества haskell, поскольку utf16 сочетает в себе недостатки как utf8 и utf32, не имея при этом никаких преимуществ.

Ответ 4

Я не думаю, что для String существует единственная техническая причина. И я вижу несколько из них, чтобы он мог пойти.

В целом я бы сначала сказал, что в случае Text/String есть только одно лучшее решение:

  • Показатели строк плохие, все согласны с тем, что

  • Текст не сложно использовать. Все функции, обычно используемые в String, доступны в тексте, а также некоторые полезные в контексте строк (подстановка, заполнение, кодирование).

  • имеющий два решения, создает ненужную сложность, если все базовые функции не являются полиморфными. Доказательство. Существуют вопросы SO по вопросу об автоматических преобразованиях. Так что это проблема.

Итак, одно решение менее сложное, чем два, и недостатки String заставят его исчезнуть в конце концов. Чем раньше, тем лучше!

Ответ 5

Интересно, всегда ли Data.Text эффективнее Data.String???

"cons", например, O (1) для строк и O (n) для текста. Append - это O (n) для строк и O (n + m) для строгих текстовых. Аналогично,

    let foo = "foo" ++ bigchunk
        bar = "bar" ++ bigchunk

больше пространства для строк, чем для строгих текстов.

Другая проблема, не связанная с эффективностью, - это сопоставление шаблонов (проницательный код) и ленивость (предсказуемо для каждого символа в строках, как-то реализация зависит от ленивого текста).

Текст, очевидно, хорош для статических последовательностей символов и для модификации на месте. Для других форм структурного редактирования Data.String может иметь преимущества.