モナドに対してジェネリックな値があると想像してください:
m :: (Monad m) => m A -- 'A' is some concrete type
ここで、この値を 2 つの別々の方法で具体的なモナド変換子スタックに特化したとしましょう。
m1 :: T M A
m1 = m
m2 :: T M A
m2 = lift m
...M
とT M
はモナドであり、T
はモナド変換子です:
instance Monad M where ...
instance (Monad m) => Monad (T m) where ...
instance MonadTrans T where ...
...そしてそれらのインスタンスはモナド則とモナド変換子則に従います。
次のように推測できますか。
m1 = m2
...m
そのタイプ以外について何も知らないのですか?
lift m
これは、 が の有効な置換であるかどうかを尋ねるための、長ったらしい方法ですm
。m
置換の前後に 2 つの別個のモナドとして型チェックが必要なため、質問を表現するのは少し難しいです。私が知る限り、そのような置換が型チェックを行う唯一の方法はm
、モナドに対してジェネリックである場合です。
私の漠然とした直感は、置換は常に正しいはずですが、私の直感が正しいかどうか、またはそれが正しいかどうかを証明する方法がわかりません。