の具体例を考えてみましょうIOT Maybe
。Monad
そのためのインスタンスをどのように記述しますか? 次のようなものから始めることができます。
instance Monad (IOT Maybe) where
return x = IOT (Just (return x))
IOT Nothing >>= _ = IOT Nothing
IOT (Just m) >>= k = IOT $ error "what now?"
where m' = liftM (runIOT . k) m
これで がありますがm' :: IO (Maybe (IO b))
、タイプ の何かが必要ですMaybe (IO b)
。最も重要なのは、Just
との間の選択Nothing
が によって決定される必要があることm'
です。それはどのように実装されますか?
もちろん、答えは、できないから、そうしないだろうということです。また、純粋なインターフェイスの背後に隠されている を正当化することもできません。これは、基本的に、 内の何かの結果に依存unsafePerformIO
する純粋な値 (コンストラクターの選択) を求めているためです。んんんんんん、そんなことは起こらない。Maybe
IO
一般的なケースでは、状況はさらに悪化します。恣意的な (普遍的に量化された)Monad
ものは、アンラップするのが実際よりもさらに不可能だからIO
です。
ちなみに、ST
言及したトランスフォーマーは、提案されたものとは異なる方法で実装されていますIOT
。これは、コンパイラによって提供される特別なプリミティブであるマジック ピクシー ダストST
を使用して as a のState
ようなモナドの内部実装を使用し、それに基づいて - のような変換子を定義します。はさらに魔法の として内部的に実装されているため、仮説は同様の方法で定義できます。StateT
IO
ST
IOT
これによって実際に何かが変わるというわけではありませんが、IOT
.