haskell - 在 Haskell 中映射 IO

标签 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] []

最佳答案

标准方式是通过:

Control.Monad.mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]

这是按顺序实现的:
sequence :: (Monad m) => [m a] -> m [a]

关于haskell - 在 Haskell 中映射 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159441/

相关文章:

haskell - 没有最后一个参数的函数组成

haskell - 优化 Haskell 函数以防止堆栈溢出

javascript - 你如何防止 javascript 中的 Math.random() 多次选择相同的数字?

java - 如何使两个字符串之间随机连接

c - 如何缓冲和延迟 printf() 输出?

c - 为什么写入现有文件比写入不存在的文件慢?

haskell - 为什么 `succ i` 在 `i::Num a => a` 处有效(而不是 `Enum a` )?

haskell - 无法在 C 中添加自然数的后果

python - sklearn.model_selection.train_test_split 示例中的 "random-state"是什么?

java - CharBuffer 与 char[]