haskell - 安全地将文本序列化为字节串

标签 haskell

文本包不提供Binary实例来编码/解码文本。我已阅读并理解其背后的原因(即,Text 应该与编码无关)。但是,我需要一个 TextBinary 实例。我发现有一个名为 text-binary 的包可以执行此操作。但实例如下:

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

非常好,除了 decodeUtf8 是一个部分函数,​​所以我宁愿使用 decodeUtf8' 并通过 Get 传递失败> 单子(monad)。我不知道如何使用 Get monad 正确失败。通过查看 Data.Binary.Get,我看到了这一点:

data Decoder a = Fail !B.ByteString {-# UNPACK #-} !ByteOffset String
          | Partial (Maybe B.ByteString -> Decoder a)
          | Done !B.ByteString {-# UNPACK #-} !ByteOffset a

这似乎表明有一种方法可以做我想做的事。我只是看不出库作者打算如何使用它。我很欣赏比我更有学识的人所提供的任何见解。

最佳答案

好吧,尽管我们倾向于忽略它,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"

我不确定使用 fail 是否仍应被视为“正确”,但对于这样的情况来说,这似乎是显而易见的事情。我想即使它从 Monad 类中删除,还会有其他一些 class MonadPlus m => MonadFail m where failure::String -> m a which Get 将是一个实例。

关于haskell - 安全地将文本序列化为字节串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25264844/

相关文章:

haskell - 用 char 或 int 拆分字符串/列表

haskell - 为什么这个 applicative 语句没有被懒惰地评估,我怎么能理解为什么?

Haskell:如何获取#define-d 常量的值?

haskell - 刚性类型变量不匹配

haskell - 我们可以使用 Haskell 与 Razor 引擎进行 Web 开发吗?

haskell - 有没有办法通知 Haskell 在 sum 类型中解包类型类

haskell - 确定 Haskell 中的类型

haskell - 封闭类型类

haskell - Haskell 中的运行长度编码

haskell - 转换为 Pointfree 风格?