Нет, он не будет работать как монада, потому что вы используете изменяемое состояние.
Представьте, что у вас есть монадическое значение m
(значение, содержащее состояние), которое вы называетеStateStore
.Вы хотите быть в состоянии сделать это:
(let
[a (incr-state m)
b (decr-state m)]
(if some-condition a b))
Я ожидаю, что это вычисление вернет монадический m
, состояние которого было, согласно some-condition
, увеличено или уменьшено.Если вы используете изменяемое состояние, оно будет и увеличиваться и уменьшаться во время оценки этого кода.
Одна из хороших особенностей монад заключается в том, что, хотя они представляют эффекты, они ведут себя как обычные чистые, неизменяемые значения.Вы можете передавать их, дублировать (вы можете расширить любое определение let
монадического значения, заменив его имя определением на каждом сайте использования).Единственное место, где вы должны быть осторожны, это где вы на самом деле цепочка эффект, используя m-bind
.В противном случае не существует неявного связывания эффектов в несвязанных частях кода, как в обычном императивном программировании.Это то, что делает рассуждения о монадах проще и удобнее в ситуациях, когда вы хотите ограничить побочные эффекты.
Редактировать
Возможно, вы слышали о монадических законах , которые являются уравнениями, которые должна соблюдать любая реализация монады.Однако ваша проблема здесь не в том, что вы нарушаете закон, поскольку закон не говорит об этом.Действительно, монадические законы обычно изложены на чистом языке Хаскелла, и поэтому не учитывают побочные эффекты.
Если вы хотите, вы можете рассматривать его как четвертый, невысказанный, монадический закон: хорошие монады должны уважать ссылочная прозрачность