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