gpt4 book ai didi

haskell - 如何重构使用状态单子(monad)变压器的程序?

转载 作者:行者123 更新时间:2023-12-02 13:16:47 25 4
gpt4 key购买 nike

我完成了(嗯,几乎)我的第一个或多或少有用的 Haskell 项目。它由多个模块组成,几乎所有模块都大量使用 StateT

总体情况是:在顶层,我需要同时处理状态和 IO,因此我使用 StateT myState IO monad 转换器。没关系,我的代码神奇地“正常工作”,但现在我认为代码可能并不完美,因为其他模块中的很多函数都在 monad 转换器内部,因此它们可能可以执行 IO,尽管它们非常纯粹他们的本性。这是一件坏事。

你能告诉我如何重构程序,以便我可以以某种方式在 State monad 内的模块中编写函数,而不需要任何 IO,但能够将其结合起来IO 代码位于顶层?

最佳答案

如果你的函数只需要 StateT,你可以给它一个签名,例如

incrementCounter :: (Monad m) => (StateT Counter m ())
incrementCounter = do count <- get
put (increment count)
return ()

这样你的函数需要与任何 Monad m 一起工作(并且不能依赖它是 IO)。在顶层,您可以实例化 m = IO。

关于haskell - 如何重构使用状态单子(monad)变压器的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26467280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com