haskell - 什么(如果有的话)是最小化 IO Monad 对我的代码的影响的普遍接受的方法
问题描述
我在 IO Monad 上有点挣扎。(仍然是 101 学习者)
我相信我理解将“IO”与纯功能代码分离的绝佳理由,但这似乎使我的代码在使用时钟和环境属性时变得更加复杂。这是一个示例(与时钟有关):
timeZoneSeconds = liftA (60*) $ liftA timeZoneMinutes getCurrentTimeZone
现在,我在程序的其他地方有很多与 timeZoneSeconds 相关的东西——加法、减法、比较,并且当 timeZoneSeconds 与其他位交互时,实际上我正在处理的所有内容都变成了“IO”,因此用liftAs填充我的代码。
所以基本上我看到我所有的纯代码都变成了 IO 脏代码。
在我看到的所有教学材料中,大多数关于 IO monad 的解释都是一般的“读东西然后写东西”,没有太多“计算东西”。
有没有推荐的方法来减少这种影响?
我是否应该重新定义“在幕后”使用 liftA 所需的所有运算符?
还是我应该继续做下去?
解决方案
将其视为依赖注入。您将不纯调用的结果注入到纯代码中,然后使用纯代码的结果进行更多的不纯 IO,例如打印结果:
main = do
env <- lookupEnv "ENV"
tz <- getCurrentTimeZone
let result = pureCode env tz
putStr result
您的pureCode
功能没有任何IO
附加功能。
推荐阅读
- javascript - 如何在Javascript中按值对数组中的嵌套字典进行排序
- maven - 将 Maven 项目迁移到 Gradle 的问题
- python - Python,如何对多元时间序列进行聚类?
- swift - 标题视图未扩展到 safeArea SwiftUI
- angular - 从 FireStore GET 订阅刷新数据 - Angular - Firebase/FireStore
- html - 从 URL 源创建 html 表
- python - 一个对象如何影响同一类的另一个对象?
- unity3d - 如何将力传递给统一的子刚体?
- android - 投射按钮变灰
- websocket - 服务器可以通过发送另一条消息来扰乱我当前的操作吗?