【发布时间】:2016-01-01 08:30:49
【问题描述】:
如果您希望附加两个类型为 (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 中,我怀疑有一个很好的理由,但找不到哪一个。
注意
这个问题与this one 很相似。但是,对于 Monoid,我看不到定义实例的方法,例如:
instance (Monad m, Monoid b) => Monoid (a -> m b) where
[...]
因为已经有一个实例:
instance Monoid b => Monoid (a -> b) where
[...]
【问题讨论】:
标签: haskell monads monoids kleisli