haskell bytestring

Haskell Cómo convertir Char a Word8



bytestring (4)

Quiero dividir ByteString en palabras así:

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 obtuve:

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?


El módulo Data.ByteString.Char8 permite tratar los valores de Word8 en los bytestrings como Char . Sólo

import qualified Data.ByteString.Char8 as C

luego refiérase por ejemplo a C.split . Es el mismo bytestring bajo el capó, pero las funciones orientadas a Char se proporcionan para un conveniente análisis de bytes / ascii.


En caso de que realmente necesite Data.ByteString (no Data.ByteString.Char8), podría hacer lo que Data.ByteString hace para convertir 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 ()


Personas que buscan un simple Char -> Word8 con biblioteca base:

import Data.Word charToWord8 :: Char -> Word8 charToWord8 = toEnum . fromEnum


Quiero abordar directamente la pregunta en la línea de asunto, lo que me llevó aquí en primer lugar.

Puede convertir un solo Char en un único Word8 con fromIntegral.ord :

λ> import qualified Data.ByteString as BS λ> import Data.Char(ord) λ> BS.split (fromIntegral.ord $ ''d'') $ BS.pack . map (fromIntegral.ord) $ "abcdef" ["abc","ef"]

Tenga en cuenta que esta conversión será propensa a desbordamientos como se muestra a continuación. Debe asegurarse de que su Char encaja en 8 bits , si no desea que esto ocurra.

λ> 260 :: Word8 4

Por supuesto, para su problema particular, es preferible utilizar el módulo Data.ByteString.Char8 como ya se indicó en la respuesta aceptada.