我想知道这个monad在Haskell生态系统中是否有一个标准名称
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)
这是有用的,使得可能的非终止计算可以是"无限"的;暂停";。
最终目标是将它与LogicT
相结合,这样我就可以搜索可能的非终止函数。我最初推出了自己的实现,但记账已经失控,尤其是因为我在组合中还有其他的单子效果。
Delay
看起来与free
库中Control.Monad.Trans.Iter
中的Iter
同构。
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
具体地,Done a
对应于IterT Identity (Left a)
,Wait (Delay a)
对应于IterT Identity (Right (IterT Identity a))
。