Есть ли способы восстановить достаточно лени, чтобы завязать узел в монаде? - PullRequest
11 голосов
/ 05 декабря 2011

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

n <- myinstr n x

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

Я пытался использовать DoRec иНаивная реализация mfix,

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

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

1 Ответ

14 голосов
/ 05 декабря 2011

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

...