是否有一种编程语言或包支持内存中基于表的反应式声明式编程,与 SQL 语言和触发器工具非常相似?
例如,我可以将PERSON
和JOB
表定义为函数
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 触发器来表达,但我希望将这样的功能内置到语言中并在内存中执行。变化的传播需要优化。有框架可以做到这一点吗?
观察者模式和反应式编程专注于单个对象。但是我不想为表中的每一行维护指针和额外的结构,因为可能有数百万行。所有规则都是通用的(尽管它们可以通过父/子关系等引用不同的行),因此需要某种形式的递归。