是否存在处理来自大型持久数据结构的更改通知的通用方法?

时间:2011-03-24 20:08:57

标签: data-structures functional-programming

首先,这个问题的动机是:任何使用持久性数据结构和gui的人都会遇到这个问题。所以,我的问题是:人们只是根据具体情况进行研究,或者是他们的库,实用程序,框架,以及一般案例的摘要,使其更容易实现。

我所针对的特定语言是Scala,但我认为这是与持久数据结构相关的一般性问题。

假设您在具有树,表,属性表等的复杂gui中显示大型数据结构。各种用户或系统操作会导致对数据结构的修改。

是否有处理通知的一般策略告诉gui自行更新?

持久性数据结构的一个有趣的想法是只需在根之间切换就可以处理撤消/重做。这适用于数据,但有一个通用机制告诉听众(例如,一个gui)关于如果要切换根的变化吗?

我的理解是它需要增量 - 我需要知道改变了什么。我不能只是告诉所有事情来完全刷新gui,因为这可能非常昂贵(并且由于维持gui状态,一些控件不能很好地处理它(或根本没有)。

2 个答案:

答案 0 :(得分:0)

您在切换根目录的同时更新GUI,因为如果结构是真正持久的,那么结构内部的任何更改都将产生新的根。然而,这将是必要的(或者在某种monadic构造中;我从未在Haskell中完成GUI编程)。

,例如,如果您的GUI代码是命令式/ OO但使用持久State结构:

// poor man's zipper for unbounded undo/redo
var curState : State
var prevStates : List[State]
var nextStates : List[State]

def undo = {
    val prev = prevStates.head
    prevStates = prevStates.tail
    nextStates = curState :: nextStates
    curState = prev
    updateGui(curState)
}

答案 1 :(得分:0)

请参阅有关Functional Reactive Programming in Scala的问题。另请参阅Cells menifestoWikipedia article about FRP作为背景信息。

阅读文章“使用Scala.React弃用观察者模式”:http://lamp.epfl.ch/~imaier/pub/DeprecatingObserversTR2010.pdf在magicduncan对上述SO问题的回答中提及。