关于如何使用Undo Monad Transformer的简单示例

时间:2014-03-25 17:09:21

标签: haskell monads monad-transformers

我正在网上搜索有关如何使用Undo Monad Transformer的教程/示例,但未找到任何内容。

有人可以给出一个展示如何使用它的简约示例吗?

或指出一本书的解释也会有所帮助。

我想用它在一个简单的编辑器中实现撤消/重做操作。

1 个答案:

答案 0 :(得分:4)

我也找不到任何教程,但我想我很清楚这一点可以解释。

我们首先需要拼凑一个类型来代表我们的编辑目前的状态,现在只做

 type EditorState = Int

然后我们可以将其提供给我们的Undo monad

 type Editor = Undo EditorState

现在我们可以做类似

的事情了
 fakeUser = do
   put 1 -- Current state is 1
   put 2 -- Current state is 2, 1 is saved in undo buffer
   put 3 -- Current state is 3, 1 and 2 are saved
   undo  -- Move 3 to redo buffer, pop 2 off of undo buffer, current state is 2
   redo  -- reverse of the above, current state is 3

所以你可以把它想象成一个列表*中的光标,我们可以在这个列表中来回移动,左边意味着我们“撤消”事物,而正确意味着我们“重做”事物。使用put将一个元素粘贴到当前点的列表中,并将旧元素移动到撤消缓冲区。

我建议依赖MonadState实例进行插入,因为它在Undo的内部提示有点太多,如果我们想要它会使事情变得复杂通过编辑跟踪其他州。

但是,这是一段非常简单的代码,您可以更新为而不是使用MonadState,摆脱数据类型上下文,删除对-f-glasgow-extensions的依赖关系如果你有一点时间的话,我会不满意,然后上传到hackage作为一个简单的库。

*这种结构的名称是“拉链”