如何从 Monad 列表到列表的 Monad

Han*_*und 4 monads haskell

我正在寻找一种将 [m [a]] 类型转换为 m [[a]] 的方法,其中 m 是某种类型的 Monad。

Vik*_*lis 14

您正在寻找Control.Monad.sequence

\n
\xce\xbb> import Control.Monad (sequence)\n\n\xce\xbb> sequence [Just [1,2,3], Just [4,5,6], Just [7,8,9]]\nJust [[1,2,3],[4,5,6],[7,8,9]]\n
Run Code Online (Sandbox Code Playgroud)\n

它的类型是(Traversable t, Monad m) => t (m a) -> m (t a).
\n特化tto[]ato [a],我们得到

\n
sequence :: [m [a]] -> m [[a]]\n
Run Code Online (Sandbox Code Playgroud)\n

  • 顺便说一句,使用简化签名,这也是[Hoogle 立即建议的](https://hoogle.haskell.org/?hoogle=%5Bm+a%5D+-%3E+m+%5Ba%5D&scope=set%3Astackage)。 (4认同)