Haskell 可以推导出以下实例MonadState s
in T1
低于但不在T2
然而,这是一个非常相似的类型。我应该以什么方式修改代码T2
这样的实例MonadState s
可以自动导出吗?
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Control.Monad.Reader
import Control.Monad.State
newtype T1 r s a =
T1 { runT1 :: ReaderT r (State s) a }
deriving (Monad, MonadReader r, MonadState s)
newtype T2 r s a =
T2 { runT2 :: StateT r (State s) a }
deriving (Monad, MonadState r, MonadState s)
你不能让一个类型有两个实例MonadState
。这是因为MonadState
定义为
class Monad m => MonadState s m | m -> s where
get :: m s
set :: s -> m ()
state :: (s -> (a, s)) -> m a
关键部分是| m -> s
。这需要扩展FunctionalDependencies
,并指出对于任何m
,我们自动知道关联的s
。这意味着对于任何给定的m
, 只能有one选择s
这是有效的。所以你不能让它同时适用MonadState r m
and MonadState s m
unless r ~ s
. If r ~ s
,那么编译器如何知道它适用于哪个底层 monad?在这种情况下,我认为您还会发现,如果您创建,那么理解和使用代码会容易得多get
and put
带有后缀来指示哪个函数,例如getInner
, setInner
and getOuter
, setOuter
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)