【问题标题】:How to sync operations between AST and DOM in haskell?如何在haskell中同步AST和DOM之间的操作?
【发布时间】:2018-06-21 06:32:45
【问题描述】:

为了在 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,并在它们之间同步用户操作(例如将子节点替换为另一个),此外,我希望有效地同步操作(这意味着只应该重建修改后的子节点),我应该如何处理这个?

一种解决方案是为每个 AST 节点和 DOM 节点分配一个 id,当一侧发生操作时,我们将该操作同步到具有相同 id 的另一侧节点,但这一步在函数式编程中似乎很棘手,我单独问了这个问题:How to generate stable id for AST nodes in functional programming?.

另一种解决方案是重新定义数据结构,让一侧保留另一侧的IORef,当操作发生时,我们可以通过引用将操作同步到另一侧。但这种方法似乎不起作用。

那么,在函数式编程中是否有解决这个问题的最佳实践?

【问题讨论】:

标签: haskell functional-programming abstract-syntax-tree structured-text


【解决方案1】:

我不确定您是否主要在寻找一种通用的方式来同步两种方式(通过什么界面?这是在浏览器中,还是在纯 Haskell 函数中?),或者是一种方法前端网络编程。对于前者,请考虑FRP and reactive-banana,它可以让您表达双向事件。对于后者,考虑像Miso 这样的东西,它使用 GHCJS 生成与 DOM 有效交互的前端 Web 浏览器代码。 (味噌类似于Elm。)

【讨论】:

  • 抱歉不清楚,现在我添加了更多描述以使其更清晰。
  • @luochen1990:我不知道还能说什么。您可以使用 GHCJS 阅读 how Miso does it
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多