52700.fb2
:: (a, a) -> IO a
randomIO
:: IO a
Эти функции выполняют тоже, что и основные функции класса, но им не нужен генератор случайных
чисел, они создают его с помощью функции getStdRandom. Экземпляры Random определены для Bool, Char,
Double, Float, Int и Integer. Например так мы можем подбросить кости десять раз:
134 | Глава 8: IO
Prelude System.Random> fmap (take 10 . randomRs (1, 6)) getStdGen
[5,6,5,5,6,4,6,4,4,4]
Prelude System.Random> fmap (take 10 . randomRs (1, 6)) getStdGen
[5,6,5,5,6,4,6,4,4,4]
Обратите внимание на то, что функция getStdGen не обновляет генератор случайных чисел. Мы запра-
шиваем глобальное состояние. Поэтому, дважды подбросив кубик, мы получили одни и те же результаты.
Генератор будет обновляться, если воспользоваться функцией newStdGen:
Prelude System.Random> fmap (take 10 . randomRs (1, 6)) newStdGen
[1,1,5,6,5,2,5,5,5,3]
Prelude System.Random> fmap (take 10 . randomRs (1, 6)) newStdGen
[5,4,6,5,5,5,1,5,5,2]
Создадим случайные слова из пяти букв:
Prelude System.Random> fmap (take 5 . randomRs (’a’, ’z’)) newStdGen
”maclg”
Prelude System.Random> fmap (take 5 . randomRs (’a’, ’z’)) newStdGen
”nfjoa”
Цитатник
Напишем небольшую программу, которая будет выводить на экран в случайном порядке цитаты. Цитаты
хранятся в виде списка пар (автор, высказывание). Сначала мы генерируем случайное число в диапазоне
длины списка, затем выбираем цитату под этим номером и выводим её на экран.
module Main where
import Control.Applicative
import System.Random
main =
format . (quotes !! ) <$> randomRIO (0, length quotes - 1)
>>= putStrLn
format (a, b) = b
++ space ++ a ++ space
where space = ”\n\n”
quotes = [
(”Бьёрн Страуструп”,
”Есть лишь два вида языков программирования: те, \
\ на которые вечно жалуются, и те, которые никогда \
\ не используются.”),
(”Мохатма Ганди”, ”Ты должен быть теми изменениями, которые\
\ ты хочешь видеть вокруг.”),
(”Сократ”, ”Я знаю лишь то, что ничего не знаю.”),
(”Китайская народная мудрость”, ”Сохранив спокойствие в минуту\
\ гнева, вы можете избежать сотни дней сожалений”),
(”Жан Батист Мольер”, ”Медленно растущие деревья приносят лучшие плоды”),
(”Антуан де Сент-Экзюпери”, ”Жить это значит медленно рождаться”),
(”Альберт Эйнштейн”, ”Фантазия важнее знания.”),