haskell - 在haskell中处理无效状态
问题描述
我试图更好地了解如何在 Haskell 中处理错误状态,因为似乎有很多方法可以做到这一点。理想情况下,我的数据结构会使任何无效输入都无法表示,但尽管为此付出了相当大的努力,但我仍然偶尔会处理类型系统允许无效状态的数据。例如,假设我的程序输入是神经网络的训练结果。为了使数学起作用,每个矩阵都需要有正确的边界,而这不是(真正)可以由类型系统表示的。如果数据无效,则应用程序实际上无能为力,只能停止任何进一步的处理并通知某人该问题(因此无法恢复)。在 Haskell 中处理这个问题的最佳方法是什么?好像我可以:
1)error
处理我的数据时使用或其他部分功能。我的理解是这应该只用于表示代码中的错误。因此,在我加载数据时,它必须与某种验证相结合,并且在检查“之后”的任何点,我只是假设数据是有效格式。这对我来说是必要的,而且似乎不太适合懒惰的声明性代码。
2)使用 处理数据时抛出异常Control.Exception.throw
,然后在我可以提醒某人的顶层捕获它。相反error
,我认为这并不表示程序中存在错误,因此当我加载超出类型系统可以表示的数据时,可能不会进行验证?处理数据时是否存在异常将定义验证。
3) 将任何可能失败的数据处理提升到 IO monad 并使用Control.Exception.throwIO
.
4) 将任何可能失败的数据处理提升到 IO monad 中并使用fail
(我读过fail
社区不赞成使用这种方法?)
5)返回一个Either
或类似的东西,然后让它在你的所有逻辑中冒出来。我肯定遇到过一些情况,其中编写Either
s 变得(对我而言)非常不切实际。
6)使用Control.Monad.Exception,我只是勉强理解,但似乎涉及将任何可能失败的数据处理提升为一些特殊的monad,我认为应该比Either
?
我什至不确定这就是所有选项。是否有解决这个问题的方法被社区普遍接受,或者这真的是一个固执己见的话题?
解决方案
推荐阅读
- reactjs - 如何在页面加载时获取数据,然后使用 useEffect 获取按钮单击
- search - 有没有办法根据保存的搜索编写计划更新脚本?
- ansible - Ansible 错误:“列表对象”在使用 read_csv 模块时没有属性“名称”
- eclipse - .classpath / .settings 文件夹存在于 Eclipse 但我找不到它
- javascript - 使用 UrlFetchApp 进行 Facebook API 营销
- php - 如何使用尊重验证验证电子邮件列表
- r - 在 Shiny 中,如何添加标志性的复选框组输入以根据选择创建数据表,其中包含列名上的图标而不是文本?
- reactjs - 使用 React Storybook 的 Knob 插件避免重复道具名称的可重用功能?
- javascript - jest.mock 模块工厂函数调用
- java - 将某个 json 值传递给另一个活动