是否有传统的方法来映射使用IO的函数?具体来说,我想映射一个返回某种随机值的函数.使用法线贴图将产生类型([IO b])的输出,但要从IO中解压缩列表中的值,我需要一些类型(IO [b]).所以我写了......
mapIO :: (a -> IO b) -> [a] -> [b] -> IO [b]
mapIO f [] acc = do return acc
mapIO f (x:xs) acc = do
new <- f x
mapIO f xs (new:acc)
Run Code Online (Sandbox Code Playgroud)
......工作正常.但似乎应该有一个内置于Haskell的解决方案.例如,一个示例用例:
getPercent :: Int -> IO Bool
getPercent x = do
y <- getStdRandom (randomR (1,100))
return $ y < x
mapIO (\f -> getPercent 50) [0..10] []
Run Code Online (Sandbox Code Playgroud)
Don*_*art 23
标准方式是:
Control.Monad.mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
Run Code Online (Sandbox Code Playgroud)
这是按顺序实现的:
sequence :: (Monad m) => [m a] -> m [a]
Run Code Online (Sandbox Code Playgroud)
Cri*_*ris 13
只是为了添加Don的答案,也可以看一下这个mapM_
功能,它确实做了什么mapM
,但是丢弃了所有的结果,所以你只得到副作用.
如果您希望执行计算(例如IO计算)但对结果不感兴趣(例如,取消链接文件),这将非常有用.
而且还看到forM
和forM_
.