在函数式编程中,数据模型是不可变的,更新数据模型是通过在数据模型上应用函数并获得新版本的数据模型作为回报来完成的。不过,我想知道人们如何为此类数据模型编写高效的查看器/编辑器(更具体地说,在 Clojure 中)
一个简化的例子:假设你想为一棵大树实现一个查看器。在非功能世界中,您可以拥有一个用于树的控制器,带有一个函数 updateNode(Node, Value),然后它可以通知所有观察者告诉他们树中的特定节点已被更新。在查看器方面,您可以将所有节点放在一个 TreeView 小部件中,保留 Node->WidgetNode 的映射,当您收到某个 Node 已更改的通知时,您可以只更新树中需要更新的一个对应的 NodeWidget .
另一个 Clojure MVC 问题中描述的解决方案讨论了将模型保存在 ref 中并添加观察者。虽然这确实可以让您收到模型更改的通知,但您仍然不知道哪个节点被更新,并且必须遍历整个树,对吗?
我能想到的最好的事情是在最坏的情况下更新从根到更改节点的路径上的所有节点(因为所有这些节点都会不同)
更新不可变数据模型视图的标准解决方案是什么?