haskell - 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
看起来它与库中的Iter
from是同构的。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))