在Haskell中映射IO

时间:2010-07-01 15:49:22

标签: haskell random io

是否有传统的方法来映射使用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] []

2 个答案:

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

另请参阅forMforM_