[英]Haskell How to convert Char to Word8
我想将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
类型签名的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和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 ()
人们在寻找具有基本库的简单Char -> Word8
:
import Data.Word
charToWord8 :: Char -> Word8
charToWord8 = toEnum . fromEnum
我想直接在主题栏中解决这个问题,这首先导致了我的到来。
您可以使用fromIntegral.ord
将单个Char
转换为单个Word8
:
λ> 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模块,该模块已在接受的答案中指出。
另一种可能的解决方案如下:
charToWord8 :: Char -> Word8
charToWord8 = fromIntegral . ord
{-# INLINE charToWord8 #-}
其中ord :: Chat → Int
和其他人可以推断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.