我有一个问题:我有一个由不同类的对象组成的树形结构,在子类中的某个操作会使得其父类无效。在命令式语言中,这很容易实现。例如,在Java中:
public class A {
private List<B> m_children = new LinkedList<B>();
private boolean m_valid = true;
public void invalidate() {
m_valid = false;
}
public void addChild(B child) {
m_children.add(child);
child.m_parent = this;
}
}
public class B {
public A m_parent = null;
private int m_data = 0;
public void setData(int data) {
m_data = 0;
m_parent.invalidate();
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
b.setData(0); //invalidates A
}
}
如何在Haskell中完成上述操作?我无法理解,因为一旦在Haskell中构建了一个对象,就无法更改它。
如果可以发布相关的Haskell代码,我将不胜感激。
编辑:我要解决的问题是:
我有一个编辑文档的应用程序。一个文档是对象的层次结构。当修改子对象的属性时,需要将文档设置为无效状态,以便用户知道需要验证文档。
ST
或IO
单子来实现。使用STRef
作为“可变”指针。 - yairchu