Я читаю главу 9 (Больше ввода и больше вывода) Учите вас в Haskell для отличного хорошего. Теперь я собираюсь научиться генерировать случайные числа в Haskell (это так интересно!). Вот цитата из книги:Генерация случайных чисел в Haskell
Чтобы вручную создать случайный генератор, используйте
mkStdGenfunction
. Он имеет типmkStdGen :: Int -> StdGen
. Он принимает целое число и, основываясь на этом, дает нам случайный генератор. Итак, давайте попробуем использоватьrandom
иmkStdGenin
тандем, чтобы получить (вряд ли) случайное число.
ghci> random (mkStdGen 100)
<interactive>:1:0:
Ambiguous type variable `a' in the constraint:
`Random a' arising from a use of `random' at <interactive>:1:0-20
Probable fix: add a type signature that fixes these type variable(s)
Что это? Ах, правильно, функция
random
может возвращать значение любого типа, входящего в класс типаRandom
, поэтому нам нужно сообщить Haskell, какой тип мы хотим. Также давайте не будем забывать, что он возвращает случайное значение и случайный генератор в паре.
Проблема заключается в том, что я не получаю эту ошибку, на самом деле, я могу сделать следующее:
*Main> :m + System.Random
*Main System.Random> random (mkStdGen 100)
(-3633736515773289454,693699796 2103410263)
Так что мой вопрос, почему я могу оценить это выражение не получая исключение?
Просто короткое примечание к будущему: если вы действительно хотите использовать случайные числа в Haskell, пакет mwc-random будет быстрее и генерирует более качественные случайные числа. – tibbe