最优雅的方式在Haskell中进行字符串转换

时间:2016-01-25 20:10:32

标签: string haskell text type-conversion

请参阅此相关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吗?

1 个答案:

答案 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