GHC: оптимизации на низове на Haskell

Знам, че Data.Text е много по-ефективен начин за съхраняване на низови данни от String = [Char]. Въпреки това изглежда, че редица функции, които виждам в библиотеките, очакват String, предадено към тях. Свързаният списък от Chars изглежда много неефективен за четене, като се има предвид, че указателите ще заемат повече място от самия низ. Освен сливането на списъци (което може да не винаги е възможно), има ли някакви оптимизации, които GHC прави за съхранението на [Char] и прилага ли подобни принципи към други списъци?


person Clinton    schedule 31.07.2012    source източник
comment
Съмнявам се, че има твърде много оптимизации, специфични за низове - изглежда, че всичко, което можете да направите, за да подобрите списък от Chars, може да бъде направено и за списък с Ints или каквото друго искате.   -  person Tikhon Jelvis    schedule 31.07.2012


Отговори (3)


Причината, поради която всички функции на базовата библиотека използват String вместо по-ефективен тип, е, че текстовата библиотека, необходима за Text, не е част от основната библиотека. Въпреки това текстовата библиотека предоставя свои собствени варианти на различните функции за вход/изход. Можете да ги намерите в Data.Text.IO.

Също така имайте предвид, че за ефективен I/O обикновено бихте използвали една от съвременните абстракции като conduits, iteratees или pipes.

person ertes    schedule 31.07.2012

Под GHC String използва 5 думи на кодова точка в средния случай. Това обаче се смекчава от факта, че времето за изпълнение предварително разпределя знаци в ASCII диапазона.

person Jon Purdy    schedule 31.07.2012

Ето е отговорът.

Байтовите низове са нещо като списъци, само че всеки елемент е с размер един байт (или 8 бита). Начинът, по който се справят с мързела, също е различен.

person Aleksander Alekseev    schedule 31.07.2012
comment
ByteStrings представляват поредици от байтове, които могат да представляват всякакъв вид данни, докато String и Text са предназначени за Unicode текст. Те са две различни неща. - person AardvarkSoup; 06.08.2012