Haskell で視覚化された算術式エディターを実装するために、次のことを定義しました。
data AST = Lit Int
| Add AST AST
| Neg AST
eval :: AST -> Int
type TagName = String
type Attrs = M.Map String String
data DOM = Tag TagName Attrs [SubDOM]
data SubDOM = SubNode DOM | Text String
toDOM :: AST -> DOM
fromDOM :: DOM -> AST
ユーザーが AST と DOM の両方を編集できるようにし、それらの間でユーザー操作 (子ノードを別のノードに置き換えるなど) を同期できるようにしたい、さらに、操作を効率的に同期したい (つまり、変更された子ノードを再構築する必要があります)、これにどのようにアプローチすればよいですか?
解決策の 1 つは、各 AST ノードと DOM ノードに ID を割り当てることです。一方の側で操作が発生すると、この操作を同じ ID を持つもう一方の側のノードに同期しますが、この手順は関数型プログラミングでは難しいように思われ、この質問をしました別:関数型プログラミングでASTノードの安定したIDを生成する方法は? .
別の解決策は、一方が他方の IORef を保持するようにデータ構造を再定義することです。操作が発生すると、参照を介して操作を他方に同期できます。しかし、このアプローチは機能していないようです。
では、関数型プログラミングにおけるこの問題のベスト プラクティスはありますか?