LINUX.ORG.RU

ocaml длина строки

 ,


0

1

Уважаемые форумчане, не копался ли кто в реализациях окамла? Мне очень хочется знать, как там вычисляется длина строки. Как в Си или Хаскеле за O(n) или по-нормальному за O(1)? Или какая-то другая сложность? Нигде не могу найти прямого ответа на этот вопрос.

★★★★★
Ответ на: комментарий от anonymous

Почему? ByteString это сырой буфер / ленивый список таких буферов — там может лежать что угодно, а над ним уже может быть какой-нибудь http://hackage.haskell.org/package/utf8-string или тот же (сюрприз) http://hackage.haskell.org/package/text/docs/Data-Text-Encoding.html — как-то сериализаторы / сетевые библиотеки используют ByteString, а вовсе не Text, если в него «нельзя» текст загнать, то тогда непонятно как его сериализировать / гонять по сети :)

И в OCaml разве не так же — char = byte, string = bytestring?

http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/UTF...

This module defines UTF-8 encoded Unicode strings, implemented in a manner comparable to native OCaml strings.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Байтстринг в использовании намного менее удобен. Работает он быстрее, но использовать неудобно и код гораздо менее красивый. Я уж молчу про паттерн матчинг.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

По сравнению с Text или String?

Я бы про String = FilePath = [Char] вообще не говорил — непонятно зачем нужное legacy (вместе с [a] вместо Iterator c i e/Traversable t => или что там). На C++ бы так писали — using Char = uint32_t; using String = std::list<Char>; и std::list по всему <algorithm> вместо итераторов :)

По сравнению с Text — не знаю, не сталкивался с неудобством или некрасивостями — builder-ы есть и у Text и у ByteString, простейший UTF8 интерфейс для ByteString тоже есть (ну и char* буфер доступен), что-то более продвинутое... ну на то text (+ text-icu) и делались, но для простых применений ByteString в данной кодировке вполне пригоден.

Паттерн-матчинг для Text/ByteString не проблема, делается view-ерами — Ленивость и sum (комментарий).

В качестве примера есть blaze (blaze-markup, blaze-html) — чисто текстовые библиотеки которые независимо поддерживают все три бакенда (String, ByteString, Text), в бенчмарках фигурирует ByteString версия, как я понял.

quasimoto ★★★★
()

http://github.com/ocaml-batteries-team/batteries-included/blob/fecad70602791d...

http://github.com/ocaml-batteries-team/batteries-included/blob/9370680ef30e22...

То есть O(1) для length из модуля String — нативные строки с поддержкой в рантайме (GC по любому должен знать размер, плюс они байтстринги — получается элементарно).

O(n) для UTF8 (количество UTF8 символов).

O(1) для Rope (тоже количество UTF8 символов, но тут ведётся учёт при изменении).

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.