哈斯克尔如何字符转换为Word8(Haskell How to convert Char to Wo

2019-06-24 11:57发布

我想要拆分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 -> Word8Word.Word8 ' '是无效的类型构造。 关于如何解决它的任何想法?

Answer 1:

该Data.ByteString.Char8模块允许你将Word8的字节串作为值Char 。 只是

import qualified Data.ByteString.Char8 as C

再例如参考C.split 。 它的引擎盖下同样的字节串,但Char取向提供了便利字节/ ASCII解析功能。



Answer 2:

如果你真的需要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 ()


Answer 3:

人们在寻找一个简单的Char -> Word8与基库:

import Data.Word

charToWord8 :: Char -> Word8
charToWord8 = toEnum . fromEnum


Answer 4:

我想直接解决在主题行的问题,这导致我在这里摆在首位。

您可以在一个转换Char为单个Word8fromIntegral.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模块作为公认的答案已经指出。



文章来源: Haskell How to convert Char to Word8