是否有传统的方法来映射使用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)
......工作正常。但似乎应该有一个内置于Haskell的解决方案。例如,一个示例用例:
getPercent :: Int -> IO Bool
getPercent x = do
y <- getStdRandom (randomR (1,100))
return $ y < x
mapIO (\f -> getPercent 50) [0..10] []
答案 0 :(得分:23)
标准方式是:
Control.Monad.mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
以序列形式实现:
sequence :: (Monad m) => [m a] -> m [a]
答案 1 :(得分:12)
只是为了添加Don的答案,也可以查看mapM_
函数,它完全符合mapM
的作用,但会丢弃所有结果,因此您只能获得副作用。
如果您希望执行计算(例如IO计算)但对结果不感兴趣(例如,取消链接文件),这非常有用。
另请参阅forM
和forM_
。