【问题标题】:Table based declarative reactive programming基于表的声明式反应式编程
【发布时间】:2023-04-01 09:40:02
【问题描述】:

是否有一种编程语言或程序包支持内存中基于表的反应式声明式编程,与 SQL 语言和触发器工具非常相似?

例如,我可以将 PERSONJOB 表定义为函数

name: PERSON -> STRING
female: PERSON -> BOOLEAN
mother: PERSON -> PEOPLE
father: PERSON -> PEOPLE

title: JOB -> STRING
company: JOB -> STRING
salary: JOB -> INTEGER
empoyee: JOB -> PERSON

然后我想计算如下函数:

childcount: PERSON -> INTEGER
childcount(P) = |{ Q in PERSON : father(Q) = P or mather(Q) = P }|

income: PERSON -> INTEGER
income(P) = SUM { salary(J) : J in JOB and empoyee(J) = P }

incomeperchild: PERSON -> INTEGER
incomeperchild(P) = income(P) / childcount(P)

parent: PERSON x PERSON -> BOOLEAN
person(P,Q) = (P = father(Q)) or (P = mother(Q))

error: PERSON -> BOOLEAN
error(P) = (female(P) and (exists Q in PERSON)(father(Q) = P))
   or (not female(P) and (exists Q in PERSON)(mother(Q) = P))
   or (exists Q in PERSON)(parent(P,Q) and error(Q))

所以基本上我希望表中的计算列在表中的值发生变化时自动更新。类似的事情可以用 SQL 触发器来表达,但我希望将这样的功能内置到语言中并在内存中执行。变化的传播需要优化。有框架可以做到这一点吗?

观察者模式和反应式编程专注于单个对象。但是我不想为表中的每一行维护指针和额外的结构,因为可能有数百万行。所有规则都是通用的(尽管它们可以通过父/子关系等引用不同的行),因此需要某种形式的递归。

【问题讨论】:

  • 好的,我的例子很简单。我想到的计算更加复杂(服务器端和客户端的交互式网络,等待来自数据库的结果,下载新信息,打包许多对象等)。当然,所有这些都可以直接在 OOP 中完成,但它很快就会变得复杂。此外,我想推迟计算某些列,直到完全计算完其他列。这对于 OOP 来说很难,因为你不能只调用更新函数,你必须一次收集更改并提交所有修改。
  • 您可能正在寻找espressologic.com

标签: sql functional-programming declarative


【解决方案1】:

解决此问题的一种方法是通过属性语法:http://www.haskell.org/haskellwiki/Attribute_grammar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2019-03-16
    • 2012-04-17
    相关资源
    最近更新 更多