我对IO Monad有点纠结。(仍然只是一个101级的学习者)
我相信我理解将"IO“从纯功能代码中分离出来的绝佳理由,但这似乎使我的代码在使用时钟和环境属性时变得更加复杂。下面是一个例子(与时钟相关):
timeZoneSeconds = liftA (60*) $ liftA timeZoneMinutes getCurrentTimeZone现在,我有很多关于timeZoneSeconds的其他事情要做--加、减、比较--在程序的其他地方,当timeZoneSeconds与其他位交互时,我处理的几乎所有事情都会变成一个"IO ",从而用timeZoneSeconds填充我的代码。
所以基本上我看到我所有的纯代码都变成了IO脏代码。
在我看到的所有说教材料中,围绕IO monad的大多数解释都是“先读东西再写东西”,没有太多的“计算材料”。
有没有推荐的方法来最小化这种影响?
我是否应该重新定义“在幕后”使用liftA所需的所有运算符?
或者我应该继续做下去?
发布于 2020-07-11 00:30:12
可以把它看作是依赖注入。您将不纯调用的结果注入到纯代码中,然后使用纯代码的结果执行更多的不纯IO,例如打印结果:
main = do
env <- lookupEnv "ENV"
tz <- getCurrentTimeZone
let result = pureCode env tz
putStr result您的pureCode函数没有附加任何IO。
https://stackoverflow.com/questions/62836068
复制相似问题