如何编写步进 monad?

How to write a stepping monad?

假设我有一些函数会永远重复出现,我知道的最简单的函数是:

f x = f x

我如何编写一个 monad 来修改此函数的行为,以便它为我提供 x 的值,以及一个将计算下一步的延续,由该步骤的 x 值和续...

您可以将其构造如下(使用 Haskell 进行说明):

data Steps a where
  Done :: a -> Steps a
  ToDo :: b -> (b -> Steps a) -> Steps a

明显的 monad 实现。

但是,由于 b 是在 ToDo 构造函数中存在的类型,因此您无法对这些中间结果做很多事情。实际上,我认为这不会给您提供比

的普通旧偏爱单子更多的信息
data Partial a = Now a | Later (Partial a)