[英]Mapping over IO in Haskell
是否有传统的方法来映射使用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] []
标准方式是:
Control.Monad.mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
这是按顺序实现的:
sequence :: (Monad m) => [m a] -> m [a]
只是为了添加Don的答案,也可以看看mapM_
函数,它正是mapM
所做的,但是丢弃了所有结果,所以你只能得到副作用。
如果您希望执行计算(例如IO计算)但对结果不感兴趣(例如,取消链接文件),这将非常有用。
还可以看到forM
和forM_
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.