在惰性和严格的ByteString之间轻松切换

时间:2015-06-23 10:31:20

标签: haskell bytestring

我需要使用严格和懒惰的ByteStrings,因为这是库选择预设的要求(一些混合了happstack,base64,sha256,hexpat等)。经过与“fromStrict”的一些舞蹈之后,我最终得到了这个:

import qualified Data.ByteString.Char8  as S
import qualified Data.ByteString.Lazy.Char8  as L

class BString s where
  lazy :: s -> L.ByteString
  strict :: s -> S.ByteString
  pack :: String -> s
  text :: T.Text -> s

instance BString L.ByteString where
  lazy = id
  strict = S.concat . L.toChunks
  pack = L.pack
  text = L.fromStrict . TE.encodeUtf8

instance BString S.ByteString where
  lazy = L.fromStrict
  strict = id
  pack = S.pack
  text = TE.encodeUtf8 

因此,当手中的库函数需要惰性字节字符串或严格版本时的“严格$”时,我只需要放置“lazy $”。虽然工作正常,但偶尔会转换,但感觉就像我在这里发明了自行车一样。

所以,问题是这些代码是否有更好的(更短的,静态类型的,更有效的)替代方案?是否有图书馆试图统一懒惰/严格处理?或者也许我做错了,这被认为是一种不好的做法(你不应该在懒惰和严格之间转换)?

感谢。

1 个答案:

答案 0 :(得分:1)

我会在您的应用程序和这些库之间编写一个自适应层,以执行所有必要的转换。设计适配层,以便将首选应用程序数据类型用作这些函数的输入和输出。

选择模块后,库函数的签名永远不会改变。也就是说,你知道对base64编码的调用将返回什么样的字符串(通过你选择的模块。)因此,如果你需要将两个库函数联系在一起,你就可以准确地知道需要进行哪些转换以使两者适合。