В основном это вопрос. Кажется, что mfix
может быть определен для любого монадического вычисления, хотя он может расходиться:
mfix :: (a -> m a) -> m a
mfix f = fix (join . liftM f)
Что не так с этой конструкцией? Кроме того, почему отдельные классы Monad
и MonadFix
разделяются (например, какой тип имеет экземпляр Monad
, но не MonadFix
)?