Monad是否有一个将计算隐藏在构造函数后面的标准名称(和库实现)



我想知道这个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))

最新更新