Любые методы для восстановления достаточно лени, чтобы связать узел в монаде?

Я хочу написать фрагмент кода (экономя много времени, чтобы реализовать в противном случае) связывая узел. Это примерно так,

n <- myinstr n x

где теоретически myinstr должен запускать x, чтобы получить значение, которое станет n. myinstr, который проходит внутри монады State, помещает n в состояние, но это не влияет на вычисление x.

Я пробовал использовать DoRec и naiive реализацию mfix,

instance Monad 𝔪 => MonadFix (MyMonad 𝔪) where
    mfix f = fix (\mx -> mx >>= f)

но все замораживается. Существуют ли какие-либо методы для исправления моего кода (или методики его правильного проектирования в первый раз) или я должен написать что-то более прямое?

Ответ 1

Нет никакого общего способа сделать произвольную монаду экземпляром MonadFix. Фактический код зависит от монады, и это даже не возможно для всех монад. Вы можете посмотреть на различные монады, чтобы посмотреть, как это делается. И если ваша монада на самом деле State, то уже должен быть экземпляр.