首页 > 解决方案 > 什么(如果有的话)是最小化 IO Monad 对我的代码的影响的普遍接受的方法

问题描述

我在 IO Monad 上有点挣扎。(仍然是 101 学习者)

我相信我理解将“IO”与纯功能代码分离的绝佳理由,但这似乎使我的代码在使用时钟和环境属性时变得更加复杂。这是一个示例(与时钟有关):

timeZoneSeconds = liftA (60*) $ liftA timeZoneMinutes getCurrentTimeZone

现在,我在程序的其他地方有很多与 timeZoneSeconds 相关的东西——加法、减法、比较,并且当 timeZoneSeconds 与其他位交互时,实际上我正在处理的所有内容都变成了“IO”,因此用liftAs填充我的代码。

所以基本上我看到我所有的纯代码都变成了 IO 脏代码。

在我看到的所有教学材料中,大多数关于 IO monad 的解释都是一般的“读东西然后写东西”,没有太多“计算东西”。

有没有推荐的方法来减少这种影响?

我是否应该重新定义“在幕后”使用 liftA 所需的所有运算符?

还是我应该继续做下去?

标签: haskellfunctional-programmingio-monad

解决方案


将其视为依赖注入。您将不纯调用的结果注入到纯代码中,然后使用纯代码的结果进行更多的不纯 IO,例如打印结果:

main = do
  env <- lookupEnv "ENV"
  tz <- getCurrentTimeZone
  let result = pureCode env tz
  putStr result

您的pureCode功能没有任何IO附加功能。


推荐阅读