Haskell Monad是否有一个标准名称(和库实现)来隐藏构造函数后面的计算?
我想知道这个单子在Haskell生态系统中是否有一个标准名称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) 它非常有用,以便可能的非终止计算可以“暂停” 最
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
fromfree
构建Monad堆栈的尝试,因为它有一个MonadPlus
实例,覆盖了LogicT
的预期行为。在我看来,恢复Monad很像: