我正在网上搜索有关如何使用Undo Monad Transformer的教程/示例,但未找到任何内容。
有人可以给出一个展示如何使用它的简约示例吗?
或指出一本书的解释也会有所帮助。
我想用它在一个简单的编辑器中实现撤消/重做操作。
答案 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作为一个简单的库。
*这种结构的名称是“拉链”