Отображение по IO в 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] []
8
задан Don Stewart 16 April 2011 в 19:20
поделиться

2 ответа

Стандартный способ - через:

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

, который реализуется с точки зрения последовательности:

sequence :: (Monad m) => [m a] -> m [a]
23
ответ дан 5 December 2019 в 04:59
поделиться

Чтобы добавить к ответу Дона, обратите внимание на функцию mapM_ , которая делает в точности то же, что и mapM , но отбрасывает все результаты так что вы получите только побочные эффекты.

Это полезно, если вы хотите, чтобы вычисления выполнялись (например, вычисления ввода-вывода), но вас не интересует результат (например, отключение файлов).

А также см. для M и для M_ .

13
ответ дан 5 December 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: