所以这个问题更普遍地是关于 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/