shake-build-system - 在摇动中将 ErrIO 中的操作提升为 Action
问题描述
我使用了shake,但我调用的操作是在ErrIO 中而不是在IO monad 中。我怎样才能将这样的操作提升到Action
monad 中。我可以runErr
获取并Either
赋值,然后调用throwIO
或liftIO
(取决于结果)。这是推荐的方法吗?
代码可能是这样的:
runErr2action :: ErrIO a -> Action a
runErr2action op = liftIO $ do
res <- runErr op
case res of
Left msg -> throw msg
Right a -> return a
也许相关的问题:为什么没有MonadError
for 的实例Action
?
解决方案
Shake 规则预计要么成功产生它所承诺的结果,要么失败。在大多数情况下,它调用的任何产生Left
或失败值的东西都应该使用throw
/ error
(或理想情况下的变体IO
with liftIO
,因此异常发生在不基于评估顺序的特定点)转换为异常。但是,在某些情况下,子操作失败可能不会使规则失败,例如:
- 也许您正在运行一个测试,而测试失败是一个有效且正确的输出,您可以通过记录失败以某种明确定义的方式处理它。在许多情况下,此类故障会在更高级别上被检测到。
- 也许你有两种方法来构建东西,而
Either
第一种方法失败了,所以你应该尝试第二种方法。
至于为什么没有MonadError
for 的实例Action
,主要是因为MonadError
类型类比较少,Shake 不依赖任何提供它们的库,所以会引入额外的依赖。它也不会比error
or提供任何显着的好处liftIO . throwError
。
推荐阅读
- python-3.x - 提取 2d numpy 数组的随机 2d 窗口
- php - 如何在转换为 CSV TO XML 后直接从我的计算机或下载文件夹中自动下载 xml 格式文件
- ios - iOS 12 中未提供 FCM 通知
- elasticsearch - 弹性搜索存储分层数据并查询它
- codeigniter-3 - Codeigniter forcedownload 重定向到浏览器而不是下载文件
- c# - Azure 存储 Blob - 将 base64 上传为文本
- android - view.getDrawingCache() 在 Android API 28 中已弃用
- css - 将溢出的列缩放到较小的列(bootstrap 或 vanilla css)
- java - Javax 异常映射器只抛出 500
- c# - 使用 ViewModel 类的不同实例会导致更新 ObservableCollection 出现问题?