如何编写步进 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)
假设我有一些函数会永远重复出现,我知道的最简单的函数是:
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)