我想知道这个 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
结合起来。所以我可以搜索可能的非终止函数。我最初推出了自己的实现,但簿记失控了,特别是因为我在混合中有其他单子(monad)效果。
最佳答案
Delay
看起来它与 Iter
同构来自 Control.Monad.Trans.Iter
在 free
图书馆。
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))
.
关于haskell - Monad 是否有标准名称(和库实现)将计算隐藏在构造函数后面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63378116/