haskell - Monad 是否有标准名称(和库实现)将计算隐藏在构造函数后面?

标签 haskell monad-transformers

我想知道这个 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.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)) .

关于haskell - Monad 是否有标准名称(和库实现)将计算隐藏在构造函数后面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63378116/

相关文章:

haskell - 如何将此函数从 ExceptT 转换为 Haskell 中的 Except?

haskell - 无压缩单子(monad)变压器

haskell - 为可能没有值的数据类型指定字段的正确方法是什么

haskell - 从数据库行构建树

haskell - 使用 Servant 根据 `Maybe` 的内容以 200 或 404 响应请求

f# - 使用 bind 编写跨世界的异步函数

list - 如何在列表和 ListT monad 转换器之间干净地转换?

list - 从多个数字列表中返回最高平均值的函数

Haskell:秒差距无法打破模式

haskell - MonadBaseControl : how to lift simpleHTTP from Happstack?