在我的Haskell程序中,我需要使用String和ByteStrings:
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 $ bsbsToString工作正常,但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,以便在我的代码中进一步使用函数。
你知道怎么解决我的问题吗?
发布于 2016-05-10 01:09:51
您正在使用严格的ByteStrings和懒惰的ByteStrings,这是两种不同的类型。
此导入:
import Data.ByteString.Lazy as BS (ByteString)使ByteString引用惰性ByteStrings,因此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.ByteString和LBS.ByteString来引用严格/懒惰的ByteStrings。
发布于 2016-05-10 01:09:46
您可以使用fromStrict和toStrict在惰性和非惰性版本之间进行转换(这两个函数都在惰性字节串模块中)。
https://stackoverflow.com/questions/37121340
复制相似问题