簡體   English   中英

Haskell 如何將 Char 轉換為 Word8

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM