美好的一天。
我现在讨厌Haskell的一件事是使用字符串的软件包数量众多。
首先,我使用了原生的Haskell[Char]
字符串,但是当我尝试开始使用hackage库时,却在无尽的转换中完全迷失了。每个包似乎都使用不同的字符串实现,有些则采用他们自己的手工东西。
接下来,我选择了使用Data.Text
字符串和OverloadedStrings
扩展名重写代码,Text
因为它具有更广泛的功能集,但是似乎很多项目都更喜欢ByteString
。
有人可以简短地说明为什么要使用其中一个?
PS:顺便说一句如何从转换Text
为ByteString
?
无法将预期的类型Data.ByteString.Lazy.Internal.ByteString 与推断的类型Text匹配 预期的类型:IO Data.ByteString.Lazy.Internal.ByteString推断的类型:IO文本
我试图encodeUtf8
从Data.Text.Encoding
,但没有运气:
无法将预期的类型 Data.ByteString.Lazy.Internal.ByteString 与推断的类型Data.ByteString.Internal.ByteString进行匹配
UPD:
感谢您的答复,*大块头的好处看起来很像,但结果令我有些震惊,我的原始功能看起来像这样:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"
现在变成:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
where
toLazyBS t = fromChunks [encodeUtf8 t]
fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t
是的,此函数不起作用是因为它的错误,如果我们提供Text
给它,那么我们相信此文本已正确编码并可以使用,并且将其转换是愚蠢的事情,但是这种冗长的转换仍然需要放在外面的某个地方htmltoItems
。