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'
返回或者,而不是或者,因此您所做的模式匹配实际上应该使用左
和右
。