假设我有一个 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
最佳答案
自从
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]
然后我们可以使用绑定(bind)运算符来应用 funcTakingListOfInts
所以你最终会得到:(mapM funcReturningMyMonad es) >>= funcTakingListOfInts
关于haskell - 如何循环遍历一元值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69302874/