假设我有一个3
值的列表:es = [MyMonad 33, MyMonad 55, MyMonad 88]
。然后执行
do v1 <- funcReturningMyMonad (es !! 0)
v2 <- funcReturningMyMonad (es !! 1)
v3 <- funcReturningMyMonad (es !! 2)
funcTakingListOfInts [v1,v2,v3]
我的问题是,我想以某种方式实现这个行为的任意长度的列表n
。在上述情况下,n
为3
。我想通过列表顺序调用(>>=)
,但它不加起来。你将如何实现这种行为?
函数类型:
funcReturningMyMonad :: MyMonad Int -> MyMonad Int
funcTakingListOfInts :: [Int] -> MyMonad Int
Since
funcReturningMyMonad :: MyMonad Int -> MyMonad Int
我们可以用
mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b)
第一部分为,在本例中为
(MyMonad Int -> MyMonad Int) -> [MyMonad Int] -> MyMonad [Int]
那么我们可以使用绑定操作符来应用funcTakingListOfInts
,所以你最终会得到:
(mapM funcReturningMyMonad es) >>= funcTakingListOfInts