首页 > 解决方案 > 在haskell中处理无效状态

问题描述

我试图更好地了解如何在 Haskell 中处理错误状态,因为似乎有很多方法可以做到这一点。理想情况下,我的数据结构会使任何无效输入都无法表示,但尽管为此付出了相当大的努力,但我仍然偶尔会处理类型系统允许无效状态的数据。例如,假设我的程序输入是神经网络的训练结果。为了使数学起作用,每个矩阵都需要有正确的边界,而这不是(真正)可以由类型系统表示的。如果数据无效,则应用程序实际上无能为力,只能停止任何进一步的处理并通知某人该问题(因此无法恢复)。在 Haskell 中处理这个问题的最佳方法是什么?好像我可以:

1)error处理我的数据时使用或其他部分功能。我的理解是这应该只用于表示代码中的错误。因此,在我加载数据时,它必须与某种验证相结合,并且在检查“之后”的任何点,我只是假设数据是有效格式。这对我来说是必要的,而且似乎不太适合懒惰的声明性代码。

2)使用 处理数据时抛出异常Control.Exception.throw,然后在我可以提醒某人的顶层捕获它。相反error,我认为这并不表示程序中存在错误,因此当我加载超出类型系统可以表示的数据时,可能不会进行验证?处理数据时是否存在异常将定义验证。

3) 将任何可能失败的数据处理提升到 IO monad 并使用Control.Exception.throwIO.

4) 将任何可能失败的数据处理提升到 IO monad 中并使用fail(我读过fail社区不赞成使用这种方法?)

5)返回一个Either或类似的东西,然后让它在你的所有逻辑中冒出来。我肯定遇到过一些情况,其中编写Eithers 变得(对我而言)非常不切实际。

6)使用Control.Monad.Exception,我只是勉强理解,但似乎涉及将任何可能失败的数据处理提升为一些特殊的monad,我认为应该比Either

我什至不确定这就是所有选项。是否有解决这个问题的方法被社区普遍接受,或者这真的是一个固执己见的话题?

标签: haskellexceptionerror-handling

解决方案


推荐阅读