14

MonadTransクラスでは:

class MonadTrans t where
    -- | Lift a computation from the argument monad to the constructed monad.
    lift :: Monad m => m a -> t m a

t mモナドであることに制約されないのはなぜですか? つまり、次の理由はありません。

{-# LANGUAGE MultiParamTypeClasses #-}
class Monad (t m) => MonadTrans t m where
  lift :: Monad m => m a -> t m a

答えが「その通りだから」なら、それでいいのです。n008 にとっては紛らわしいだけです。

4

1 に答える 1

14

あなたは次のことを提案しました:

class Monad (t m) => MonadTrans t m where
    lift :: Monad m => m a -> t m a

...しかし、それは本当にあなたが望むものを意味しますか? t「型は のインスタンスである可能性がある場合MonadTrans、は のインスタンスであり、 のインスタンスm :: * -> *でもあります」のようなものを表現したいようです。mMonadt mMonad

上記のクラス定義が実際に言っていることは、「型tに似ており、それらの特定の型が「のインスタンスである場合、のmインスタンスを構成する可能性があります。違いと、意図したものではない可能性があるインスタンスの暗黙の可能性を慎重に検討してください。MonadTranst mMonad

一般に、型クラスのすべてのパラメータは独立した「引数」であり、人々が MPTC を使おうとするとき、頭痛と GHC 拡張の両方の多くの原因となっている事実です。

いずれにせよ、そのような定義が使用できなかったと言っているわけではありません。ご指摘のとおり、現在の定義も理想的ではありません。古くからの問題である「Why Data.SetIs Not a Functor」が関連しており、そのような問題が最近のConstraintKindsおふざけの動機となっています。

ここで「そうしない理由」に対する究極の答えは、ほぼ間違いなく、Daniel Fischer がコメントで与えたものMonadTransです.

于 2012-12-03T17:10:27.143 に答える