我需要使用严格和懒惰的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 $”。虽然工作正常,但偶尔会转换,但感觉就像我在这里发明了自行车一样。
所以,问题是这些代码是否有更好的(更短的,静态类型的,更有效的)替代方案?是否有图书馆试图统一懒惰/严格处理?或者也许我做错了,这被认为是一种不好的做法(你不应该在懒惰和严格之间转换)?
感谢。
答案 0 :(得分:1)
我会在您的应用程序和这些库之间编写一个自适应层,以执行所有必要的转换。设计适配层,以便将首选应用程序数据类型用作这些函数的输入和输出。
选择模块后,库函数的签名永远不会改变。也就是说,你知道对base64编码的调用将返回什么样的字符串(通过你选择的模块。)因此,如果你需要将两个库函数联系在一起,你就可以准确地知道需要进行哪些转换以使两者适合。