2012-01-23 5 views
11

Quiero escribir una función simple que divide un ByteString en [ByteString] usando '\n' como el delimitador. Mi intento:Haskell ¿Cómo crear un Word8?

import Data.ByteString 

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

Esto arroja un error porque '\n' es una Char en lugar de un Word8, que es lo que está esperando Data.ByteString.splitWith.

¿Cómo convierto este carácter simple en un Word8 con el que jugará ByteString?

Respuesta

14

Se podía usar el literal numérico 10, pero si se desea convertir el carácter literal puede utilizar fromIntegral (ord '\n') (el fromIntegral se requiere para convertir los Int que ord retornos en un Word8). Tendrá que importar Data.Char para ord.

También puede importar Data.ByteString.Char8, que ofrece funciones para usar Char en lugar de Word8 en el mismo tipo de datos ByteString. (De hecho, tiene una función lines que hace exactamente lo que quiere.) Sin embargo, esto es generalmente no recomendable, ya que ByteString s no haga almacenar puntos de código Unicode (que es lo que representa Char), pero en lugar octetos primas (es decir, Word8 s).

Si está procesando datos textuales, debería considerar usar Text en lugar de ByteString.

+0

Oh, wow. Excelente. Tendré que profundizar en las representaciones de personajes, supongo. No tengo idea de qué son los literales numéricos para los personajes. ¿Hay una lista de ellos en alguna parte? –

+0

Estoy escribiendo un programa que analizará los archivos de bases de datos de proteínas, que contienen cadenas, enteros y dobles. Las cadenas se utilizarán principalmente para identificar los elementos correctos de una lista, mientras que los valores iniciales y dobles se usarán en operaciones matemáticas. No estoy seguro de qué clase debería usar para esto. –

+1

Puede usar 'ord' en GHCi para averiguar los números de punto de código de caracteres :) Generalmente obtengo datos Unicode de [fileformat.info] (http://www.fileformat.info/info/unicode/index.htm); el bloque [Basic Latin] (http://www.fileformat.info/info/unicode/block/basic_latin/index.htm) contiene los 128 puntos de código heredados de ASCII. – ehird

Cuestiones relacionadas