首页 > 解决方案 > 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以便我可以搜索可能的非终止函数。我最初推出了自己的实现,但簿记失控了,特别是因为我在混合中有其他单子效果。

标签: haskellmonad-transformers

解决方案


Delay看起来它与库中的Iterfrom是同构的。Control.Monad.Trans.Iterfree

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))


推荐阅读