haskell - 如何在带有 do 表示法的列表上使用 map - 即避免使用 `IO ()' 类型的 `[IO ()]' 类型?

标签 haskell monads io-monad

所以这个问题更普遍地是关于 Monads(特别是 Fay),但我的例子使用了 IO monad。

我有一个函数,其中输入是字符串列表,我想一个一个地打印每个字符串。所以这是我的想法:

funct :: [String] -> ?
funct strs = do
    map putStrLn strs

但不起作用,因为它返回类型 [IO ()]。所以我的问题是,我将如何映射一个列表,并将其视为我正在逐行执行函数,以典型的 do-notation 迭代样式(如下所示)?
funct :: [String] -> IO ()
funct strs = do
    putStrLn (strs !! 0)
    putStrLn (strs !! 1)
    ...

最佳答案

大多数标准库列表函数都有以 M 结尾的单子(monad)版本。 :

map :: (a -> b) -> [a] -> [b]
mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]

replicate :: Int -> a -> [a]
replicateM :: (Monad m) => Int -> m a -> m [a]

等等。有时他们在Prelude , 有时它们在 Control.Monad .我建议使用 hoogle找到他们。

特别针对您的情况,我使用 mapM_ putStrLn经常。

关于haskell - 如何在带有 do 表示法的列表上使用 map - 即避免使用 `IO ()' 类型的 `[IO ()]' 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771549/

相关文章:

haskell - GHC 是否会在编译时减少不依赖 IO 的表达式?

haskell - 使用严格的 monad 操作无限列表

haskell - 提升的“if”函数表现异常

haskell - 单子(monad)的结合性

haskell - `<$>`/`<*>`/`join` 的组合等于 `>>=` 吗?

haskell - 如何将托盘设置在 xmonad 中的所有工作区上?

haskell - 什么(如果有的话)是最小化 IO Monad 对我的代码的影响的普遍接受的方法

haskell - 为什么 IO 是单子(monad)而不是共单子(monad)?

haskell - `x >> pure y` 等于 `liftM (const y) x`

haskell - 是否可以在 Clojure 中从 Haskell 执行 IO monad?