2012-05-16 1 views
18

Я хочу разделить ByteString на слова так:Haskell Как конвертировать Char в Word8

import qualified Data.ByteString as BS 

main = do 
    input <- BS.getLine 
    let xs = BS.split ' ' input 

Но оказывается, что GHC не может преобразовать литеру в Word8 сам по себе, так что я получил:

Couldn't match expected type `GHC.Word.Word8' 
      with actual type `Char' 
In the first argument of `BS.split', namely ' ' 
In the expression: BS.split ' ' input 

Hoogle ничего не обнаружил с тиковой сигнатурой Char -> Word8 и Word.Word8 ' ' является недопустимым конструктором типа. Любые идеи о том, как исправить это?

+4

Не используйте ' ByteString' для текста! Вместо этого используйте ['Text'] (http://hackage.haskell.org/package/text). –

+0

@ DanielWagner Почему нет? Это быстрее, чем 'ByteString'? – Andrew

+5

'Text' является дружественным к юникоду, поэтому ваши строки будут строками во всех странах. 'ByteString' предназначен для двоичного разбора, доступа к необработанной памяти и не может обрабатывать ничего, кроме ascii или latin1. –

ответ

31

Модуль Data.ByteString.Char8 позволяет обрабатывать значения Word8 в байтах как Char. Только

import qualified Data.ByteString.Char8 as C 

см., Например, C.split. Это то же самое, что и под капотом, но ориентированные функции Char предназначены для удобного анализа байта/ascii.

+0

Спасибо! Вот и все. – Andrew

17

В случае, если вы действительно нужно Data.ByteString (не Data.ByteString.Char8), вы могли бы делать то, что само по себе делает Data.ByteString конвертировать между Word8 на Чар:

import qualified Data.ByteString as BS 
import qualified Data.ByteString.Internal as BS (c2w, w2c) 

main = do 
    input <- BS.getLine 
    let xs = BS.split (BS.c2w ' ') input 
    return()