Ответ 1
Вы можете "получить" результат случайного вычисления, используя такие функции, как evalRand
и друзей. evalRand
принимает значение "start" RandomGen
и детерминированно выполняет монадическое вычисление.
Здесь мое ручное, нестрогое объяснение того, что evalRand
для:
Одно из различий между монадами и императивным программированием состоит в том, что монада является представлением вычисления, а не самим вычислением. Другими словами, когда Haskell оценивает выражение, подобное a >>= b >>= c
(или эквивалентную нотацию do
), оно просто кладет кирпичи Lego вместе, так сказать, вычисление не выполняется до тех пор, пока вы не выполните монаду с использованием функции например evalRand
.
Для более простого примера, подумайте о том, как создавать функции вместе. .
дает вам функцию, которая представляет собой вычисление, выполняемое двумя выполняемыми ею функциями. Вы получаете только возвращаемое значение из этого вычисления, когда вы фактически вызываете функцию с аргументом.
Вот почему многие из монад в стандартной библиотеке (за исключением IO
, которые выполняются системой времени выполнения) предоставляют функцию "ловушки", например evalRand
. Это то, как вы на самом деле используете вычисление, которое вы только что определили в своем монадическом коде.