Тот факт, что реализация Haskell по умолчанию String
неэффективна как с точки зрения скорости, так и с памятью, хорошо известна. Насколько мне известно, [] lists
в целом реализованы в Haskell как односвязные списки и для большинства небольших/простых типов данных (например, Int
), это не очень хорошая идея, но для String
это похоже на полный перебор. Некоторые из мнений по этому вопросу включают:
В простых тестах, подобных этому, даже программы, написанные на интерпретируемых языках, таких как Python, могут превосходить код Haskell, который использует String на порядок.
Эффективная реализация строк в Haskell
Поскольку String является только [ Char], это связанный список Char, это означает, что Strings имеют плохую локальность ссылки и снова означает, что Strings довольно большие в памяти, как минимум, N * (21 бит + Мбит), где N - длина строки, а M - размер указателя (...). Строки гораздо реже могут быть оптимизированы для циклов и т.д. Компилятором.
Я знаю, что Haskell имеет ByteString
(и Array
s) в нескольких приятных вкусах и что они могут выполнять работу красиво, но я ожидал бы, что реализация по умолчанию будет самой эффективной.
TL; DR: Почему реализация Haskell по умолчанию String
представляет собой односвязный список, хотя он ужасно неэффективен и редко используется для приложений реального мира (за исключением действительно простых)? Есть ли исторические причины? Легче ли реализовать?