Haskell 安全地将文本序列化为Bytestring

Haskell 安全地将文本序列化为Bytestring,haskell,Haskell,文本包不提供对文本进行编码/解码的二进制实例。我已经阅读并理解了这背后的原因(即,文本应该是编码不可知的)。但是,我需要一个Text的Binary实例。我发现有一个名为text binary的包可以做到这一点。但具体情况如下: instance Binary T.Text where put = put . T.encodeUtf8 get = T.decodeUtf8 <$> get 这似乎表明有一种方法可以实现我的愿望。我只是不明白图书馆的作者打算如何使用它。我

文本包不提供对文本进行编码/解码的
二进制
实例。我已经阅读并理解了这背后的原因(即,
文本
应该是编码不可知的)。但是,我需要一个
Text
Binary
实例。我发现有一个名为text binary的包可以做到这一点。但具体情况如下:

instance Binary T.Text where
    put = put . T.encodeUtf8
    get = T.decodeUtf8 <$> get

这似乎表明有一种方法可以实现我的愿望。我只是不明白图书馆的作者打算如何使用它。我很欣赏一个比我更博学的头脑所能提供的任何见解。

好吧,尽管我们倾向于忽视它,
Monad
类仍然有那种令人讨厌的
失败
方法:

   get = do
      utf8'd <- get 
      case T.decodeUtf8' utf8'd of
         Just t  -> return t
         Nothing -> fail "No parse for UTF-8 Text"
get=do
utf8'd返回t
Nothing->fail“不解析UTF-8文本”

我不确定使用
fail
是否仍然被认为是“正确的”,但对于这样的情况,这似乎是显而易见的。我想即使它从
Monad
类中删除,也会有其他
类MonadPlus m=>MonadFail m,其中fail::String->ma
将是
Get
的一个实例。

好吧,尽管我们倾向于忽略它,
Monad
类仍然有那种讨厌的
fail
方法:

   get = do
      utf8'd <- get 
      case T.decodeUtf8' utf8'd of
         Just t  -> return t
         Nothing -> fail "No parse for UTF-8 Text"
get=do
utf8'd返回t
Nothing->fail“不解析UTF-8文本”

我不确定使用
fail
是否仍然被认为是“正确的”,但对于这样的情况,这似乎是显而易见的。我想即使它从
Monad
类中删除,也会有其他
类MonadPlus m=>MonadFail m,其中fail::String->ma
将是
Get
的一个实例。

我通常反对使用
fail
,但我查阅了
Get
的定义,而且它确实有一个合法的定义(一个不会使程序崩溃的定义)。我永远不会为未知的单子调用fail,但是因为我确定fail在这里是如何定义的,所以我同意它。另外,为了将来读者的利益,我将提到
decodeUtf8'
返回
或者
,而不是
可能
,因此您所做的模式匹配实际上应该使用
。我通常反对使用
失败
,但我查阅了
获取
的定义,而且它确实有一个合法的定义(一个不会使程序崩溃的定义)。我永远不会为未知的单子调用fail,但是因为我确定fail在这里是如何定义的,所以我同意它。另外,为了将来读者的利益,我将提到
decodeUtf8'
返回
或者
,而不是
或者
,因此您所做的模式匹配实际上应该使用