这个问题显示了 的实例定义(,) 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)
所以问题是如何写这个???
部分?
更新
实际上,这个问题是一个更通用问题的特例:是否可以编写类型类的实例来作用于某些未出现在末尾的类型?就我而言,类型构造函数是(,) a b
,我想让它成为Monad a
wherea
不是最后一个类型参数的实例。