4

Real World Haskellの本のこのセクションhttp://book.realworldhaskell.org/read/monad-transformers.html#id659032MonadStateは、新しいモナド変換子を作成するときに、、MonadIOなどのインスタンスを手動で導出する必要があることを示唆しています。

しかし、私は以下を試し、それをコンパイルしました。なぜ図書館で行われないのですか?

私がMaybeTモナド変換子を持っているとしましょう:

newtype MaybeT m a = MaybeT {
    runMaybeT :: m (Maybe a)
}

instance Monad m => Monad (MaybeT m) where -- blah blah

instance MonadTrans MaybeT where
    lift = MaybeT . (liftM Just)

tそれがaMonadTransでありm、であることがわかったらMonad、なぜ他のすべてをこのように自動的に導出できないのでしょうか。

instance (MonadTrans t, Monad (t m), MonadIO m) => MonadIO (t m) where
    liftIO = lift . liftIO

instance (MonadTrans t, Monad (t m), MonadState s m) => MonadState s (t m) where
    get = lift get
    put = lift . put

著者は、新しいものごとにこれを手動で行う必要があることを意味しますか、MonadTransそれとも私は彼を間違えますか?

どうもありがとうございます :)

4

1 に答える 1

4

彼らがこれを行わない理由は非常に単純です。

  1. まず、これを追加すると、多くの古いコードが壊れてしまいます。なぜなら、UndecidableInstancesGHC に自動定義インスタンスと手動定義インスタンスのどちらかを決定させるようなものが必要だからです。これは非常に面倒です。
  2. 上記とは異なるインスタンスを定義したい場合は、おそらくパフォーマンス上の理由や何らかのハックを行うためでしょうか? この小さなボイラープレートは、カスタマイズされたインスタンスを定義することができない/コストが高い (必要なインスタンスをGHCに伝えるためのトリッキーのため) よりも好ましいと思います.
于 2010-12-06T10:04:02.187 に答える