有方法(>>=) :: forall a b. m a -> (a -> m b) -> m b。我如何使方法:: forall a b. m (n a) -> (a -> m (n b)) -> m (n b),其中m和n是单。
发布于 2017-11-30 14:41:48
正如PyRulez所写的,对此没有通用的解决方案,但是考虑到您报告的类型,下面这样的内容应该可以工作。
你需要
import Control.Monad (join)使用do符号,您可以组成两个函数,foo和bar,如下所示:
comp :: (a -> TargetClient (MethodResult b)) ->
(b -> TargetClient (MethodResult c)) ->
a -> TargetClient (MethodResult c)
comp foo bar x = do
f <- foo x
b <- join <$> traverse bar f
return b如果您不喜欢do表示法,可以将其全部简化为:
comp' :: (a -> TargetClient (MethodResult b)) ->
(b -> TargetClient (MethodResult c)) ->
a -> TargetClient (MethodResult c)
comp' foo bar x = foo x >>= fmap join . traverse bar当您用f映射bar时,可以这样说,您将按错误的顺序堆放单块,但是您可以使用traverse来切换堆栈。即使这样做,Either中也会有一个join,这就是需要join的原因。
发布于 2017-11-30 16:53:16
如果m和n都是monad,那么还需要一个额外的部分来使复合m.n也是一个单子。
需要的是一种“分布规律”,这是一种自然的态射forall a . n(m a) -> m(n a) (参见这里,它来自贝克,也用于街道)
然后,就可以很容易地写出缺失的部分,并验证它是否满足单一定律。
https://stackoverflow.com/questions/47564655
复制相似问题