Monad实例对

时间:2013-10-05 09:51:30

标签: haskell monads

This question显示(,) a b的实例定义,其中aMonoid的实例。

但是,我不知道如何为(,) 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 a的实例,其中a不是最后一个类型参数。

2 个答案:

答案 0 :(得分:5)

我们可以写,现在同义词的作品不适合这种情况,所以我们使用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)

答案 1 :(得分:1)

你做不到。 Monad在其参数中具有多态性是至关重要的,所以如果一个特定的monadish事物只对monoids有意义,那么它不是monad。

例如,return :: Monad m => a -> m a。您无法在return的签名中添加额外的约束。