On peut aussi utiliser, sans grande différence conceptuelle, un type
récursif avec des mutables :
type color = Blanc | Noir;;
type image = Color of color | Node of feuille
and feuille = {mutable fils : image list};;
Et le triangle devient :
let rec triangle=Node {fils=[Color Blanc; triangle; Color Noir;
triangle]};;
Il est absolument nécessaire d'utiliser des mutables pour pouvoir
modifier une image, sinon la plupart des algorithmes ne seraient pas
implémentables, faute de pouvoir construire une image
progressivement. En effet, pour l'image du triangle par exemple, pour
instancier la variable, il faut conna^tre ses fils, et comme elle fait
partie de ses fils, il faut l'avoir déjà définie pour
instancier ses fils ! (voir les algorithmes)
Ce type est particulièrement intéressant pour qui veut lui ajouter des caractéristiques par la suite, il est alors très simple d'ajouter des champs, ce qui a été fait pour la compression fractale.
Un de ces champs peut d'ailleurs servir à marquer les variables déjà rencontrées, ce qui permettrait de gagner un ordre dans la plupart des algorithmes.