文本包不提供Binary
实例来编码/解码文本。我已阅读并理解其背后的原因(即,Text
应该与编码无关)。但是,我需要一个 Text
的 Binary
实例。我发现有一个名为 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/