Строгая государственная монада определяется с помощью:
m >>= k = State $ \s ->
case runState m s of
(a, s') -> runState (k a) s'
Но это все еще может утешить память, потому что a
и s'
остаются неоцененными. Например, у нас может быть функция f
, которая принимает большой объект в качестве входных данных и быстро возвращает (a, s')
, но пока значение a
остается неоцененным, вход в f
не может быть GC'ed.
Одно потенциальное решение состоит в том, чтобы иметь f
return seq a (a, s')
, но это не всегда возможно, если мы используем что-то вроде MonadRandom
, а состояние инкапсулировано в сторону от f
. Есть версия, которая определяется следующим образом:
m >>= k = State $ \s ->
case runState m s of
(!a, !s') -> runState (k a) s'
Разве это уже существует в библиотеке?