Haskell如何将Char转换为Word8

时间:2012-05-16 17:15:57

标签: haskell bytestring

我想将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 ' '为无效类型构造函数的任何内容。关于如何解决它的任何想法?

4 个答案:

答案 0 :(得分:33)

Data.ByteString.Char8模块允许您将字节串中的Word8值视为Char。只是

import qualified Data.ByteString.Char8 as C

然后参考例如C.split。它是引擎盖下的相同字节串,但提供了面向Char的函数,以方便字节/ ascii解析。

答案 1 :(得分:17)

如果您确实需要Data.ByteString(而不是Data.ByteString.Char8),您可以执行Data.ByteString本身在Word8到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 ()

答案 2 :(得分:0)

人们正在寻找带有基本库的简单Char -> Word8

import Data.Word

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

答案 3 :(得分:0)

我想直接在主题行中解决这个问题,这首先导致了我的到来。

您可以使用 Char 将单个 Word8 转换为单个 fromIntegral.ord :< / p>

λ> 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模块,如接受的答案中已经指出的那样。