gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:45:40 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com