2012-05-16 31 views
18

Quiero dividir ByteString a las palabras de este modo:Haskell Cómo convertir a Char Word8

import qualified Data.ByteString as BS 

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

Pero parece que GHC no puede convertir un carácter literal a Word8 por sí mismo, así que me dieron:

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 no encuentra nada con la firma de tipo Char -> Word8 y Word.Word8 ' ' es un constructor de tipo no válido. ¿Alguna idea de cómo arreglarlo?

+4

No utilice ' ByteString' para texto Utilice ['Text'] (http://hackage.haskell.org/package/text) en su lugar. –

+0

@DanielWagner ¿Por qué no? ¿Es más rápido que 'ByteString'? – Andrew

+5

'Text' es unicode-friendly, por lo que sus cadenas serán cadenas en todos los países. 'ByteString' es para análisis binario, acceso de memoria sin procesar y no puede manejar nada que no sea ascii o latin1. –

Respuesta

31

El módulo Data.ByteString.Char8 le permite tratar los valores Word8 en las cadenas de bytes como Char. Solo

import qualified Data.ByteString.Char8 as C 

y consulte, por ejemplo, C.split. Es la misma cadena de bytes debajo del capó, pero las funciones orientadas a Char se proporcionan para el análisis conveniente de byte/ascii.

+0

Gracias! Eso fue todo. – Andrew

17

En caso de que realmente necesita Data.ByteString (no Data.ByteString.Char8), que podría hacer lo mismo Data.ByteString hace para convertir entre Word8 a CHAR:

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()