次の例を考えてみましょう。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
か?
ありがとう。