Haskell Как создать Word8?

Я хочу написать простую функцию, которая разбивает ByteString на [ByteString], используя '\n' в качестве разделителя. Моя попытка:

import Data.ByteString

listize :: ByteString -> [ByteString]
listize xs = Data.ByteString.splitWith (=='\n') xs

Это выдает ошибку, потому что '\n' — это Char, а не Word8, что Data.ByteString.splitWith ожидает.

Как превратить этого простого персонажа в Word8, с которым будет играть ByteString?


person Xander Dunn    schedule 23.01.2012    source источник


Ответы (1)


Вы можете просто использовать числовой литерал 10, но если вы хотите преобразовать символьный литерал, вы можете использовать fromIntegral (ord '\n') (fromIntegral требуется для преобразования Int, возвращаемого ord, в Word8). Вам придется импортировать Data.Char для ord.

Вы также можете импортировать Data.ByteString.Char8, который предлагает функции для используя Char вместо Word8 для того же типа данных ByteString. (Действительно, у него есть lines которая делает именно то, что вам нужно.) Однако обычно это не рекомендуется, так как ByteStrings не хранит кодовые точки Unicode (что представляет Char), а вместо этого необработанные октеты (т.е. Word8s).

Если вы обрабатываете текстовые данные, вам следует использовать Text вместо ByteString.

person ehird    schedule 23.01.2012
comment
Ух ты. Превосходно. Думаю, мне придется копаться в представлениях персонажей. Я понятия не имею, что такое числовые литералы для символов. Есть ли где-нибудь их список? - person Xander Dunn; 23.01.2012
comment
Я пишу программу, которая будет анализировать файлы базы данных белков, которые содержат строки, целые числа и двойные числа. Строки в основном будут использоваться для определения правильных элементов из списка, тогда как целые и двойные числа будут использоваться в математических операциях. Я не уверен, какой класс я должен использовать для этого. - person Xander Dunn; 23.01.2012
comment
Вы можете использовать ord в GHCi, чтобы узнать номера кодовых точек символов :) Обычно я получаю данные Unicode из fileformat.info; блок Basic Latin содержит 128 кодовых точек, унаследованных от ASCII. - person ehird; 23.01.2012
comment
Что касается подходящего типа для вашей программы, это зависит от конкретного формата и того, что вы делаете, но если они не содержат никаких двоичных данных, то Text будет работать нормально. Однако, если строки всегда представляют собой чистый ASCII, и вы обрабатываете большой объем данных, то ByteString, скорее всего, будет быстрее. - person ehird; 23.01.2012
comment
Да, файлы строго ASCII, и целью является производительность. Спасибо. - person Xander Dunn; 23.01.2012
comment
Как мне теперь создать Word8? - person peer; 13.02.2016