Http 我如何知道在Haskell程序中哪里可以抛出异常?

Http 我如何知道在Haskell程序中哪里可以抛出异常?,http,haskell,exception,type-safety,haskell-pipes,Http,Haskell,Exception,Type Safety,Haskell Pipes,我正在从事一个1-10k线的个人Haskell项目,我正在使用各种IO库,例如Network.HTTP.conduct-insider-workers和Pipes.Concurrent 我刚刚意识到有些IO库在边缘情况下抛出异常 GHC有没有办法在编译时向我发出关于未捕获异常的警告?找出库可以抛出的异常的最佳方法是什么 谢谢 只是回答我自己的问题,2018年的情况。希望随着时间的推移,情况会有所改善 在编译时,无法知道Haskell程序的哪些部分可以抛出异常。有些库选择返回或可能返回monad以

我正在从事一个1-10k线的个人Haskell项目,我正在使用各种IO库,例如Network.HTTP.conduct-insider-workers和Pipes.Concurrent

我刚刚意识到有些IO库在边缘情况下抛出异常

GHC有没有办法在编译时向我发出关于未捕获异常的警告?找出库可以抛出的异常的最佳方法是什么


谢谢

只是回答我自己的问题,2018年的情况。希望随着时间的推移,情况会有所改善

在编译时,无法知道Haskell程序的哪些部分可以抛出异常。有些库选择返回或可能返回monad以安全地处理边缘情况,而另一些库选择抛出异常


就个人而言,我认为这使得Haskell在生产环境中运行的吸引力大大降低,特别是因为这些异常很少有堆栈跟踪。

基本上,任何函数在评估其中一个输入时都可以抛出异常,这会使整个任务变得更加模糊。无法获得一个完美的工具并不意味着无法创建一个有用的工具来警告许多异常,但我不知道有任何这样的工具。Liquid Haskell的totality checker部分做到了这一点,但与其他很多东西捆绑在一起,我不确定你是否能有效地利用它。感谢你的想法——如果没有其他人这么做,我可能会自己做。你知道为什么类型系统中没有Java中那样的异常吗?在Java中,任何东西都可能抛出
运行时异常
,而这在类型中没有记录。这归结为社区标准。我对寻找违反社区标准的图书馆的建议(在Haskell中是“当你可以简单地传回结构化数据时,不要扔掉”)是为了避免使用它们。@FriedBrice我曾经与图书馆作者争论过,但没有成功。事实证明,人们更看重开发的简单性,而不是纯粹的API。使用异常而不是求和类型是cryptonite等大型库以及network等低级库的标准。@ThomasMDuBuisson这确实是一种令人悲哀的情况。它支持谁的“易开发性”?当然不是图书馆的消费者。