我尝试从T
Handle
反序列化h
类型的某些数据。 T
有Binary
个实例。有两个限制因素:
h
中有其他数据被代码的其他部分消耗。这使得很难以(懒惰或严格)ByteString
阅读内容并在Get T
上运行ByteString
。
有没有办法直接在Get T
上投放Handle
?
答案 0 :(得分:1)
使用hGetContents
懒惰地将所有数据读入字节串,然后反序列化。
如果您的代码的其他部分在使用后需要访问句柄,那么您需要手动从句柄中读取字节,直到您能够确定您感兴趣的部分的结束位置。 (有关详细信息,请参阅hGetContents
的实现)之后,您可以停止读取字节并将句柄传递给程序的任何部分。
请注意,在代码中使用一个位置(线程?)从句柄反序列化/解析然后取消结果,而不是绕过句柄本身可能是更好的设计。如果这样做,您可以使用hGetContents
并将所有反序列化代码保存在一个位置。如果你在整个代码中经常使用它,你也可以考虑将读/写句柄包装成monad变换器/免费monad效果。