Monads可以做许多惊人的,疯狂的事情。 他们可以创buildvariables来保存值的叠加。 在计算之前,它们可以让您访问未来的数据。 他们可以让你写破坏性的更新,但不是真的。 然后继续monad让你打破人心! 通常你自己的。 😉 但是,这是一个挑战:你能制造一个可以暂停的monad吗? 数据暂停sx 实例Monad(暂停) mutate ::(s – > s) – >暂停s() yield :: Pause s() step :: s – > Pause s() – >(s,Maybe(Pause s())) Pause monad是一种状态monad(因此mutate ,明显的语义)。 通常像这样的monad具有某种“运行”function,它运行计算并将您返回到最终状态。 但Pause是不同的:它提供了一个step函数,它运行计算,直到它调用魔术yield函数。 这里的计算暂停,返回给调用者足够的信息以稍后恢复计算。 对于额外的awesomness:允许调用者修改step之间的状态。 (例如上面的types签名应该允许这样做。) 用例:编写复杂的代码通常很容易,但总的PITA将其转换为在其操作中也输出中间状态。 如果你希望用户能够通过执行中途改变某些事情,事情变得非常复杂。 实施思路: 显然可以通过线程,锁和IO来完成。 但是我们可以做得更好吗? 😉 疯狂的继续单子吗? 也许某种作家monad, yield只是logging当前状态,然后我们可以通过遍历日志中的状态来“伪装”来step它。 (显然,这排除了改变步骤之间的状态,因为现在我们并不真正“暂停”任何东西。)
线和纤维有什么区别? 我听说过ruby的纤维,我听说他们有其他语言可以使用,有人可以简单地向我解释线程和光纤之间的区别。