Dfr*_*Dfr 76 string text haskell
美好的一天.
我现在讨厌Haskell的一件事是用于处理字符串的数量.
首先我使用了原生的Haskell [Char]字符串,但是当我尝试开始使用hackage库时,完全失去了无休止的转换.每个包似乎都使用不同的字符串实现,有些采用自己手工制作的东西.
接下来我用Data.Text字符串和OverloadedStrings扩展名重写了我的代码,我选择了Text因为它有更广泛的功能集,但似乎很多项目更喜欢ByteString.
有人可以简短推理为什么要使用其中一个?
PS:顺便想怎么转换Text成ByteString?
无法匹配期望类型 Data.ByteString.Lazy.Internal.ByteString 对抗推断类型文本 预期类型:IO Data.ByteString.Lazy.Internal.ByteString推断类型:IO文本
我试过encodeUtf8了Data.Text.Encoding,但没有运气:
无法匹配期望类型 Data.ByteString.Lazy.Internal.ByteString 对抗推断类型Data.ByteString.Internal.ByteString
UPD:
谢谢你的回复,*Chunks的善良看起来像是要走的路,但我对结果感到有些震惊,我原来的功能看起来像这样:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"
Run Code Online (Sandbox Code Playgroud)
现在成了:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
where
toLazyBS t = fromChunks [encodeUtf8 t]
fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t
Run Code Online (Sandbox Code Playgroud)
是的,这个函数不起作用,因为它的错误,如果我们提供Text它,那么我们相信这个文本已经正确编码并准备使用并转换它是愚蠢的事情,但这样一个冗长的转换仍然需要采取放在外面的某个地方htmltoItems.
sha*_*ang 64
ByteStrings主要用于二进制数据,但如果您只需要ASCII字符集,它们也是处理文本的有效方法.如果需要处理unicode字符串,则需要使用Text.但是,我必须强调的是,它们都不能替代另一个,它们通常用于不同的东西:虽然Text代表纯粹的unicode,但是ByteString当你通过套接字或文件传输文本时,仍然需要对二进制表示进行编码..
这是一篇关于unicode基础知识的好文章,它解释了unicode代码点(Text)和编码二进制字节(ByteString)的关系:绝对最低每个软件开发人员绝对必须知道Unicode和字符集
您可以使用Data.Text.Encoding模块在两种数据类型之间进行转换,如果您使用的是惰性变体,则可以使用Data.Text.Lazy.Encoding(正如您根据错误消息所做的那样).
Joh*_*n L 26
您肯定希望将Data.Text用于文本数据.
encodeUtf8是要走的路.这个错误:
无法匹配期望类型Data.ByteString.Lazy.Internal.ByteString对抗推断类型Data.ByteString.Internal.ByteString
表示您正在为需要延迟字节字符串的代码提供严格的字节字符串.使用该功能可轻松进行转换:fromChunks
Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString
Run Code Online (Sandbox Code Playgroud)
所以你需要做的就是fromChunks [myStrictByteString]在期望lazy bytestring的地方添加函数.
另一种方式的转换可以通过双重功能完成toChunks,它采用一个惰性字节串并给出一个严格的块列表.
如果他们能够提供文本接口而不是字节串接口,或者除了字节串接口之外,您可能想要询问维护者一些软件包.