如何在一元值列表上循环?

  • 本文关键字:列表 循环 一元 haskell
  • 更新时间 :
  • 英文 :


假设我有一个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。在上述情况下,n3。我想通过列表顺序调用(>>=),但它不加起来。你将如何实现这种行为?

函数类型:

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

最新更新