我想要拆分ByteString
到像这样的话:
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 ' '
是无效的类型构造。 关于如何解决它的任何想法?
该Data.ByteString.Char8模块允许你将Word8
的字节串作为值Char
。 只是
import qualified Data.ByteString.Char8 as C
再例如参考C.split 。 它的引擎盖下同样的字节串,但Char
取向提供了便利字节/ ASCII解析功能。
如果你真的需要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 ()
人们在寻找一个简单的Char -> Word8
与基库:
import Data.Word
charToWord8 :: Char -> Word8
charToWord8 = toEnum . fromEnum
我想直接解决在主题行的问题,这导致我在这里摆在首位。
您可以在一个转换Char
为单个Word8
与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"]
请记住,这种转换就容易溢出 ,如下面所示。 你必须确保你的Char
符合8位 ,如果你不希望出现这种情况。
λ> 260 :: Word8
4
当然,对于您的特定问题,最好是使用Data.ByteString.Char8模块作为公认的答案已经指出。