繁体   English   中英

在Haskell中映射IO

[英]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计算)但对结果不感兴趣(例如,取消链接文件),这将非常有用。

还可以看到forMforM_

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM