История изменений
Исправление quasimoto, (текущая версия) :
Если брать на заметку fix, то про mfix и mdo с RecursiveDo (тем более ты про него уже писал на ЛОРе) просто нельзя не сказать :)
А вообще это чтобы кинуть в ghci и посмотреть тип, реально нужно и Monad m => m a -> (a -> m Bool) -> (a -> m b) -> m (), и с нормальным кодом (надо бы посмотреть отличается ли core у «нормального кода» и кода с fix). То есть это не только IO или MonadIO (те же free monads над функторами, именно — ADT для eDSL в котором while имеет смысл и который будет превращаться в монадический с помощью Free, так что while заработает тоже for free, а IO или трансформер над IO вообще не при делах кроме как тип результата функций интерпретации или компиляции этого Free eDSL).
Исходная версия quasimoto, :
Если брать на заметку fix, то про mfix и mdo с RecursiveDo (тем более ты про него уже писал на ЛОРе) просто нельзя не сказать :)
А вообще это чтобы кинуть в ghci и посмотреть тип, реально нужно и Monad m => m a -> (a -> m Bool) -> (a -> m b) -> m (), и с нормальным кодом (надо бы посмотреть отличается ли core у «нормального кода» и кода с fix). То есть это не только IO или MonadIO (те же free monads над функторами, именно — ADT для eDSL языка в котором while имеет смысл и который будет превращаться в монадический с помощью Free, так что while заработает тоже for free, а IO или трансформер над IO вообще не при делах кроме как тип результата функций интерпретации или компиляции этого Free eDSL).