I am wondering if this monad has a standard name in the Haskell ecosystem
data Delay a = Wait (Delay a) | Done a deriving (Show, Eq, Functor)
instance Monad Delay where
return a = Done a
(Done a) >>= f = f a
(Wait da) >>= f = Wait (da >>= f)
It is useful so that possibly non-terminating computation can be "paused".
The end goal is to combine it with LogicT
so I can search over possibly non terminating functions. I rolled my own implementation originally but the book-keeping was out of hand, especially since I have other monadic effects in the mix.
Delay
looks like it is isomorphic to Iter
from Control.Monad.Trans.Iter
in the free
library.
newtype IterT m a = IterT { runIterT :: m (Either a (IterT m a)) }
type Iter = IterT Identity
instance Monad m => Monad (IterT m) where
return = pure
IterT m >>= k = IterT $ m >>= either (runIterT . k) (return . Right . (>>= k))
fail _ = never
Specifically, Done a
corresponds to IterT Identity (Left a)
and Wait (Delay a)
to IterT Identity (Right (IterT Identity a))
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With