23

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

4

5 回答 5

34

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

import qualified Data.ByteString.Char8 as C

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

于 2012-05-16T17:20:33.187 回答
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 ()
于 2013-03-19T17:28:47.930 回答
2

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

import Data.Word

charToWord8 :: Char -> Word8
charToWord8 = toEnum . fromEnum
于 2019-02-03T16:24:03.563 回答
1

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

您可以使用以下命令将单曲转换为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模块。

于 2019-03-09T17:02:23.630 回答
0

另一种可能的解决方案如下:

charToWord8 :: Char -> Word8
charToWord8 = fromIntegral . ord
{-# INLINE charToWord8 #-}

在哪里ord :: Chat → Int,其余的可以推断。

于 2021-11-13T20:07:32.897 回答