Можно перепрыгнуть назад в программе с продолжением монады:
{-# LANGUAGE RecursiveDo #-}
import Control.Monad.Fix
import Control.Monad.Trans.Cont
setjmp = callCC (\c -> return (fix c))
backward = do
l <- setjmp
-- some code to be repeated forever
l
Но когда я пытаюсь перейти вперёд, он не принимается GHC:
forward = mdo
l
-- some dead code
l <- setjmp
return ()
Это не работает, потому что нет экземпляра для MonadFix (ContT r m)
для продолжения monad-трансформатора ContT
, определенного в Control.Monad.Trans.Cont
. Дополнительную информацию см. В разделе 5.1 тезис Левтера Эркока.
Есть ли способ кодирования прямого перехода без рекурсии значения для продолжения монады?
Есть ли альтернативное определение ContT
, которое имеет экземпляр для MonadFix (ContT r m)
? Существует неопубликованный проект Магнуса Карлсона, который делает такое предложение, но я не уверен, что с ним делать в моем случае.