2

这个问题显示了 的实例定义(,) a b,其中a的实例在哪里Monoid

但是,我不知道如何为 编写类似的东西(,) a b,并且bMonoid?的一个实例 只要能写出定义,我基本上都可以做到:

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 awherea不是最后一个类型参数的实例。

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 回答
0

你不能。在其参数中具有多态性至关重要Monad,因此如果特定的 monadish 事物仅对 monoids 有意义,那么它就不是 monad。

例如,return :: Monad m => a -> m a。您无法为return.

于 2013-10-05T10:04:24.313 回答