Строгая государственная монада определяется с помощью:
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'
Разве это уже существует в библиотеке?