gpt4 book ai didi

performance - StateT over Reader 和 ReaderT over State 之间有什么显着区别吗?

转载 作者:行者123 更新时间:2023-12-04 03:12:43 25 4
gpt4 key购买 nike

当我设计我的编程模型时,我总是陷入困境,哪种方法更好:

type MyMonad1 = StateT MyState (Reader Env)
type MyMonad2 = ReaderT Env (State MyState)

使用一个 monad 与另一个 monad 之间有什么好处和权衡?这有关系吗?性能怎么样?

最佳答案

在一般情况下,monad 转换器的不同排序会导致不同的行为,但正如评论中所指出的,对于“状态”和“阅读器”这两种排序,我们有以下同构到新类型:

StateT MyState (Reader Env) a  ~  MyState -> Env -> (a, MyState)
ReaderT Env (State MyState) a ~ Env -> MyState -> (a, MyState)

所以唯一的区别是参数顺序之一,这两个 monad 在语义上是等效的。

关于性能,如果不对实际代码进行基准测试,就很难确定。但是,作为一个数据点,如果您考虑以下 monadic 操作:
foo :: StateT Double (Reader Int) Int
foo = do
n <- ask
modify (* fromIntegral n)
gets floor

然后当使用 GHC 8.6.4 编译时使用 -O2 ,显然,新类型被优化掉了,这会生成 正好如果您将签名更改为相同的核心:
foo :: ReaderT Int (State Double) Int

除了 foo 的两个参数被翻转。所以,至少在这个简单的例子中,根本没有性能差异。

从风格上讲,您可能会遇到这样一种情况:一种排序导致的代码看起来比另一种更好,但通常在它们之间没有太多可供选择。特别是,像上面这样的基本 monadic 操作看起来与任一排序完全相同。

无缘无故,我倾向于支持 #2,主要是因为 Env -> MyState -> (a, MyState)对我来说看起来更自然。

关于performance - StateT over Reader 和 ReaderT over State 之间有什么显着区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56415402/

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