Знам, че Data.Text
е много по-ефективен начин за съхраняване на низови данни от String = [Char]
. Въпреки това изглежда, че редица функции, които виждам в библиотеките, очакват String
, предадено към тях. Свързаният списък от Char
s изглежда много неефективен за четене, като се има предвид, че указателите ще заемат повече място от самия низ. Освен сливането на списъци (което може да не винаги е възможно), има ли някакви оптимизации, които GHC прави за съхранението на [Char]
и прилага ли подобни принципи към други списъци?
GHC: оптимизации на низове на Haskell
Отговори (3)
Причината, поради която всички функции на базовата библиотека използват String
вместо по-ефективен тип, е, че текстовата библиотека, необходима за Text
, не е част от основната библиотека. Въпреки това текстовата библиотека предоставя свои собствени варианти на различните функции за вход/изход. Можете да ги намерите в Data.Text.IO
.
Също така имайте предвид, че за ефективен I/O обикновено бихте използвали една от съвременните абстракции като conduits, iteratees или pipes.
Под GHC String
използва 5 думи на кодова точка в средния случай. Това обаче се смекчава от факта, че времето за изпълнение предварително разпределя знаци в ASCII диапазона.
Ето е отговорът.
Байтовите низове са нещо като списъци, само че всеки елемент е с размер един байт (или 8 бита). Начинът, по който се справят с мързела, също е различен.