Существует ли традиционный способ отобразиться по функции, которая использует 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]
Чтобы добавить к ответу Дона, обратите внимание на функцию mapM_
, которая делает в точности то же, что и mapM
, но отбрасывает все результаты так что вы получите только побочные эффекты.
Это полезно, если вы хотите, чтобы вычисления выполнялись (например, вычисления ввода-вывода), но вас не интересует результат (например, отключение файлов).
А также см. для M
и для M_
.