如果您希望附加两个类型为(a -> m b)的函数,以便获得仅附加两个结果的相同类型的一个函数,那么您可以使用Kleisli:
instance (Monad m, Monoid b) => Monoid (Kleisli m a b) where
mempty = Kleisli (\_ -> return mempty)
mappend k1 k2 =
Kleisli g
where
g x = do
r1 <- runKleisli k1 x
r2 <- runKleisli k2 x
return (r1 <> r2)
然而,目前在Control.Arrow
中没有这样的实例定义。
通常在Haskell中,我怀疑有一个很好的理由,但找不到原因。
注意
这个问题与这个问题非常相似。 但是,对于Monoid,我没有看到定义如下实例的方法:
instance (Monad m, Monoid b) => Monoid (a -> m b) where
[...]
因为已经存在一个实例:
instance Monoid b => Monoid (a -> b) where
[...]