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

Haskell Monad是否有一个标准名称(和库实现)来隐藏构造函数后面的计算?,haskell,monad-transformers,Haskell,Monad Transformers,我想知道这个单子在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) 它非常有用,以便可能的非终止计算可以“暂停” 最

我想知道这个单子在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
相结合,以便我可以搜索可能的非终止函数。我最初推出了自己的实现,但簿记已经失控,特别是因为我在混合中有其他一元效应。

延迟
看起来它与
免费
库中的
Iter
控制.Monad.Trans.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

具体地说,
donea
对应于
IterT标识(左a)
Wait(延迟a)
IterT标识(右a))

它也类似于来自“流”的
流标识ma
它通常被称为“Capretta的单子”(演示文稿链接自
Control.Monad.Trans.Iter
页面)我最终放弃了使用
IterT
from
free
构建Monad堆栈的尝试,因为它有一个
MonadPlus
实例,覆盖了
LogicT
的预期行为。在我看来,恢复Monad很像: