考虑下一个例子。我有一个单子MyM
,它只是一个StateT
{-# LANGUAGE TypeFamilies #-}
import Control.Monad.State
import Control.Monad.Reader
type MyS = Int
type MyM = StateT MyS
通常MyM
用于读写MyS
状态,所以我有如下功能:
f1 :: (MonadState m, StateType m ~ MyS) => m ()
f1 = modify (+1)
但有时我只需要阅读MyS
,所以我想要MonadReader
上下文而不是MonadState
:
f2 :: (MonadReader m, EnvType m ~ MyS) => m Int
f2 = liftM (+1) ask
我想写一些类似的东西:
f3 :: (MonadState m, StateType m ~ MyS) => m Int
f3 = f1 >> f2
所以基本上我需要每个MonadState
实例都是MonadReader
对应的家庭类型的实例。就像是
instance MonadState m => MonadReader where
type EnvType m = StateType m
...
但我找不到如何进行类型检查的方法。MonadState
是否可以表达和之间的这种关系MonadReader
?
谢谢。