【问题标题】:String -> ByteString and reverseString -> ByteString 和反向
【发布时间】:2016-05-09 16:53:33
【问题描述】:

在我的 Haskell 程序中,我需要使用字符串和字节字符串:

import Data.ByteString.Lazy as BS  (ByteString)
import Data.ByteString.Char8 as C8 (pack)
import Data.Char                   (chr)

stringToBS :: String -> ByteString
stringToBS str = C8.pack str

bsToString :: BS.ByteString -> String
bsToString bs = map (chr . fromEnum) . BS.unpack $ bs

bsToString 工作正常,但 stringToBS 在编译时出现以下错误:

Couldn't match expected type ‘ByteString’
                with actual type ‘Data.ByteString.Internal.ByteString’
    NB: ‘ByteString’ is defined in ‘Data.ByteString.Lazy.Internal’
        ‘Data.ByteString.Internal.ByteString’
          is defined in ‘Data.ByteString.Internal’
    In the expression: pack str
    In an equation for ‘stringToBS’: stringToBS str = pack str

但我需要让它成为Data.ByteString.Lazy as BS (ByteString) 中的ByteString,以便在我的代码中实现进一步的工作功能。

知道如何解决我的问题吗?

【问题讨论】:

  • 顺便说一句,我希望你知道你在做什么。 ByteString 是字节序列,而不是字符串:它们之间的转换基本上取决于给定的编码。特别是,Char8 假定所有内容都使用 latin-1 进行编码,并默默地截断其他所有内容。
  • 你使用String而不是Text有什么特殊原因吗?编码/解码的转换更简单一些。
  • 因为我的其他函数需要String

标签: haskell bytestring


【解决方案1】:

您正在使用两种不同类型的严格 ByteString 和惰性 ByteString。

这个导入:

import Data.ByteString.Lazy as BS  (ByteString)

使ByteString 引用惰性字节字符串,因此您的stringToBS 的类型签名与其定义不匹配:

stringToBS :: String -> ByteString  -- refers to lazy ByteStrings
stringToBS str = C8.pack str        -- refers to strict ByteStrings

我认为像这样使用import qualified 会更好:

import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Char8 as BS

并使用BS.ByteStringLBS.ByteString 来引用严格/惰性字节字符串。

【讨论】:

    【解决方案2】:

    您可以使用fromStricttoStrict 在惰性和非惰性版本之间进行转换(这两个函数都在惰性字节串模块中)。

    【讨论】:

    • urlDecode True (stringToBS str)stringToBS str = BS.fromStrict $ C8.pack str 给我带来:Couldn't match expected type ‘Data.ByteString.Internal.ByteString’ with actual type ‘ByteString’ 怎么解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多