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.