Tengo el siguiente problema: Tengo un árbol de objetos de diferentes clases donde una acción en la clase secundaria invalida el elemento primario. En lenguajes imperativos, es trivial de hacer. Por ejemplo, en Java:¿Cómo codigo un árbol de objetos en Haskell con punteros a padres e hijos?
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
}
}
¿Cómo hago lo anterior en Haskell? No puedo entender esto, ya que una vez que construyo un objeto en Haskell, no puede ser cambiado.
Me agradecería mucho si se publica el código Haskell correspondiente.
EDIT: el problema que estoy tratando de resolver es el siguiente:
He una aplicación que edita documentos. Un documento es una jerarquía de objetos. Cuando se modifican las propiedades de los objetos secundarios, el documento debe establecerse en un estado no válido, para que el usuario sepa que el documento debe validarse.
Para agregar las respuestas de sepp2k y Tal Pressman, también puede escribir el código Haskell para imitar exactamente la forma de hacer las cosas de Java, escapando del mundo funcional puro y utilizando la mónada 'ST' o' IO'. Usando 'STRef's para los punteros" cambiables ". – yairchu
Interesante. ¿Como funciona? ¿el compilador trata a STRef como una construcción especial? y ¿cuáles son las diferencias entre STRef e IORef? Lo busqué en Google, pero no se me ocurrió algo fácil de comprender. – axilmar