4
ブック実世界Haskellのからこのセクションhttp://book.realworldhaskell.org/read/monad-transformers.html#id659032は新しいモナド変圧器を書くとき、私たちは手作業などMonadState
、MonadIO
、のインスタンスを導出しなければならないことを示唆しています。なぜボイラープレート新しいモナド変圧器を書き
しかし私は以下を試してコンパイルしました。なぜそれは図書館で行われていないのですか?我々はt
がMonadTrans
で、m
は、他のすべてが自動的に次のように導出することができない理由Monad
、であることを知っていたら、その後
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)
:
は、私がMaybeT
モナド変圧器を持って言いますか?
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
ため、手動でこれを行うには持っているか、私は彼が間違って取得するということですか?
はどうもありがとうございました:)
GHCの拡張であるGeneralizedNewtypeDerivingは、モナドクラスのいくつかのインスタンスを自動的に作成できますが、どのクラスのインスタンスのリストも見つけられませんでした。上のMonadIOやMonadStateのような完全にパラメトリックなインスタンスは "悪いフォーム"です。 FUZxxlには以下のように、特殊化の用途が異なる場合がありますが、クラスメソッドが「明らかにパラメトリック」であるが、明示的なインスタンスが1つしかない場合は、クラスメソッドではなくプレーンなパラメトリック関数である必要があります。 –
ステファンありがとうございます。しかし、私はここで少し遅いです。あなたの最後の文章は、私のコードのどの部分を指していますか? (明らかにパラメトリックなクラスメソッドですが、明白なインスタンスは1つだけです)。もっと説明できますか? – Phil
こんにちは。最後の文は一般的なもので、コードとは関係ありません。しかし、putとgetが "標準ライブラリ"のクラスメソッドであるという論理を逆転させることで、あまりにも一般化されていない関数としては意味があると合理的に期待できるので、結果的には型固有のケースを書く必要があります。 –