处理Haskell zlib解压缩错误

处理Haskell zlib解压缩错误,haskell,gzip,haskell-zlib,Haskell,Gzip,Haskell Zlib,我有一个字符串x,它可能是gzip压缩的,也可能不是。使用库,我想尝试解压缩x——如果成功,函数将返回压缩字符串。如果不是(即x不是gzip压缩的),我只想返回x 当GZip.decompress生成一个错误时,如果应用于非GZip字符串,我可以使用catch或类似方法,但我特别要求使用zlib错误处理机制的解决方案 如何编写具有前面描述的特征的函数,比如decompressionfpossible::ByteString->ByteString?我更喜欢使用字符串ByteString来表示错误

我有一个字符串
x
,它可能是gzip压缩的,也可能不是。使用库,我想尝试解压缩
x
——如果成功,函数将返回压缩字符串。如果不是(即
x
不是gzip压缩的),我只想返回
x

GZip.decompress
生成一个
错误
时,如果应用于非GZip字符串,我可以使用
catch
或类似方法,但我特别要求使用
zlib
错误处理机制的解决方案

如何编写具有前面描述的特征的函数,比如
decompressionfpossible::ByteString->ByteString
?我更喜欢使用
字符串ByteString
来表示错误或解压缩结果


注意:此问题故意不表示研究工作,因为它立即以问答式的方式得到了回答。

您需要在此处使用的
zlib
函数被调用。它的值是递归的
解压缩流
数据结构,您可以使用

下面是如何编写所需函数的完整示例:

导入数据。或者
导入Codec.Compression.Zlib.Internal
将限定数据.ByteString.Lazy.Char8作为LB导入
--|转换并展开自定义解压缩流
--从zlib到a的错误格式
decompressStreamToEither::DecompressStream->String LB.ByteString
解压StreamToeither(拖缆错误uErrMsg)=左errmsg
decompressStreamToEither stream@(StreamChunk_uu)=右$fromDecompressStream
解压缩StreamToeither StreamEnd=右$“”
--|使用显式错误处理进行解压缩
安全解压缩::LB.ByteString->任一字符串LB.ByteString
safeDecompress bstr=解压流为$decompressWithErrors gzipOrZlibFormat defaultDecompressParams bstr
--|解压缩gzip,如果失败,返回未压缩字符串
解压可能性::LB.ByteString->LB.ByteString
可减压bstr=
让conv(左a)=bstr
conv(右a)=a
在(转换安全解压缩)bstr中
注意,本例使用的是自动检测报头是zlib还是gzip报头的