1

是否有一种编程语言或包支持内存中基于表的反应式声明式编程,与 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 触发器来表达,但我希望将这样的功能内置到语言中并在内存中执行。变化的传播需要优化。有框架可以做到这一点吗?

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

4

1 回答 1

0

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

于 2013-02-05T01:34:45.577 回答