请参阅此相关SO问题:Automatic conversion between String and Data.Text in haskell
给定一个类型为Text
的字符串,我想生成一个惰性字节串。
这很有效,但我想知道它是否是最优的,因为Text
和懒惰的字节串都具有"类似字符串"我仍然使用非通用的unpack
:
import qualified Data.ByteString.Lazy (ByteString)
import Data.Text (Text, unpack)
import Data.String (fromString)
import Data.Text (unpack)
convert :: IsString str => Text -> str
convert = fromString . unpack
我找到了提供多态函数的包string-conversions
convertString :: a -> b
作为ConvertibleStrings
类型类的一部分。
虽然它运作正常但我很怀疑:为什么我需要一个额外的包呢?难道不存在类似IsString
的类型类提供toString
方法并且组合使用通用转换函数fromString . toString
吗?
答案 0 :(得分:2)
[好吧,当我在编辑我的问题时,我可能会得到一个答案]
在hackage-page of string-conversions上说:
假设两种类型的ByteStrings都采用UTF-8编码。
所以有一些假设伴随着转换,并且类似字符串类型的通用转换可能并不可取。 此外,性能可能取决于输入和输出类型,并且通用转换会假装它们都是相同的。
所以我现在最好的做法就是明确而不是多态:
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as ByteString
import qualified Data.Text.Encoding as Text
convert :: Text -> ByteString
convert = ByteString.fromStrict . Text.encodeUtf8