56

他のすべてのモナドにはトランスフォーマーバージョンが付属しており、私が知っていることから、トランスフォーマーのアイデアはモナドの一般的な拡張です。他の変圧器がどのように構築されているかに続いて、次のようにIOTなります

newtype IOT m a = IOT { runIOT :: m (IO a) }

その場で便利なアプリケーションを作成IOT Maybeできます。IOアクションを実行することも、何も実行しないこともできます。IOT []後で作成できるリストを作成することもできますsequence

では、なぜHaskellにIOトランスがないのでしょうか?

(注: Haskell Cafeでこの投稿を見ましたが、あまり意味がありません。また、STトランスのハッキングページでは、関連する可能性のある問題が説明に記載されていますが、詳細は提供されていません。)

4

1 に答える 1

39

の具体例を考えてみましょうIOT MaybeMonadそのためのインスタンスをどのように記述しますか? 次のようなものから始めることができます。

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.

于 2012-10-24T20:17:20.540 に答える