Значение типа IO Integer
не является целым числом. Это действие, которое при выполнении возвращает целое число. Различие важно. Единственный способ выполнить IO
действия - подключить их к main
или ввести их в GHCi.
То есть randomRIO (0, 10)
- это действие, которое при выполнении возвращает случайное число от 0
до 10
. Обратите внимание, что это , а не функция, поскольку функция всегда должна возвращать один и тот же результат при одном и том же входном сигнале, хотя мы иногда называем это нечистая функция .
Итак, вопрос в том, как выполнить действие, возвращающее целое число, и выполнить действие, возвращающее целое число плюс два? Легко, вы можете использовать fmap
, чтобы объединить действие и чистую функцию, превращая его результат в новое действие.
fmap (+2) $ randomRIO (0, 10)
Control.Monad
содержит много полезных функций для создания новых действий из других действий. Для вашего второго примера мы можем использовать replicateM
, который создает действие, которое при выполнении запускает исходное действие несколько раз, собирая результаты в список:
replicateM 10 $ randomRIO (0, 10)
Вы также можете получить аналогичные результаты вручную, используя do
-notation.
Для получения дополнительной информации вам следует прочитать монады, например, в Learn You a Haskell .