gpt4 book ai didi

haskell - 为什么 MonadReader r (StateT s m) 使用底层 monad 的实例

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

据我所知,我们可以实现 MonadReader s (StateT s m)实例:

instance MonadReader s (StateT s m) where
ask = get
local f m = do
s <- get
put (f s)
m
put s

即为什么不是
class MonadReader s m => MonadState s m | s -> m where ...

同样,我们可以有 Monoid s => MonadWriter s (StateT s m)实例。

选择之间有什么深层次的原因吗?

这个问题的动机是 MonadErrorMonadWriter应该
MonadChronicle 的父类(super class)

最佳答案

是的,你可以这样做,但它会违反 mtl 的精神。并可能导致 API 问题。 mtl 的想法是每个标准的单子(monad)更改器(mutator)都会增加一个或多个不同的效果。添加 StateTReaderT到变压器堆栈给你一个状态和一个环境。如果 StateT实现了自己的MonadReader例如,那么您将只能通过两个不同的接口(interface)访问状态 blob。要将环境添加到组合中,您必须“手动”使用转换器。如果您看到 MonadChronicle作为提供效果,您可能希望在编写器和异常效果之上分层,那么您应该将它们分开。如果您将其视为这些效果的扩展/改进,那么父类(super class)是有意义的。

关于haskell - 为什么 MonadReader r (StateT s m) 使用底层 monad 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41096328/

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