の具体例を考えてみましょう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する純粋な値 (コンストラクターの選択) を求めているためです。んんんんんん、そんなことは起こらない。MaybeIO
一般的なケースでは、状況はさらに悪化します。恣意的な (普遍的に量化された)Monadものは、アンラップするのが実際よりもさらに不可能だからIOです。
ちなみに、ST言及したトランスフォーマーは、提案されたものとは異なる方法で実装されていますIOT。これは、コンパイラによって提供される特別なプリミティブであるマジック ピクシー ダストSTを使用して as a のStateようなモナドの内部実装を使用し、それに基づいて - のような変換子を定義します。はさらに魔法の として内部的に実装されているため、仮説は同様の方法で定義できます。StateTIOSTIOT
これによって実際に何かが変わるというわけではありませんが、IOT.