2

この質問は、 のインスタンス定義を示しています。(,) a bここで、aは のインスタンスですMonoid

(,) a bしかし、 に対して同様のことを書く方法がわかりません。また?bのインスタンスです。Monoid定義を記述できる限り、基本的にこれを行うことができます。

instance Monoid b => Monad ((,) ???) where
    return a = (a,mempty)
    ~(a,b) >>= f = let (c,b1) in f a in (c,b `mappend` b1)

問題は、その???部分をどのように書くかです。

アップデート

実際、この質問はより一般的な問題の特殊なケースです: 最後に表示されない型に作用する型クラスのインスタンスを書くことは可能ですか? 私の場合、型コンストラクターはであり、最後の型パラメーターではないwhere(,) a bのインスタンスにしたいと考えています。Monad aa

4

2 に答える 2

6

今のところ同義語はこの場合には不適切なので、newtype を使用します。

newtype RevTuple b a = RevTuple { totuple :: (a , b) }

instance Monoid b => Monad (RevTuple b) where
    return a = RevTuple (a,mempty)
    (RevTuple (a,b)) >>= f = 
                 let RevTuple (c,b1) = f a in RevTuple (c,b `mappend` b1)
于 2013-10-05T11:44:16.610 に答える