我一直在尝试在 Scala 中编码一个关系代数(据我所知,它是最先进的类型系统之一),但似乎没有找到一种方法来达到我想要的位置。
由于我对编程语言设计的学术领域没有那么丰富的经验,所以我真的不知道要寻找什么功能。
那么,实现静态验证的关系代数需要哪些语言特性,哪些语言具有这些特性呢?
一些要求: 元组是一个函数,将名称从一组静态定义的元组有效名称映射到名称指定类型的值。让我们将此名称类型称为设置域。
关系是一组具有相同域的元组,因此任何元组的范围在集合中都是唯一的
到目前为止,模型可以很容易地在 Scala 中建模
trait Tuple
trait Relation[T<Tuple] extends Set[T]
Tuple 中的 vals、vars 和 defs 是上面定义的名称类型集。但是元组中不应该有两个同名的定义。vars 和 impure defs 也应该受到限制。
现在是棘手的部分:
两个关系的连接是一种关系,其中元组的域是来自操作数元组的域的并集。这样只保留它们域的交集具有相同范围的元组。
def join(r1:Relation[T1],r2:Relation[T2]):Relation[T1 with T2]
应该做的伎俩。
关系的投影是一个关系,其中元组的域是操作数元组域的子集。
def project[T2](r:Relation[T],?1):Relation[T2>:T]
这是我不确定是否有可能找到解决方案的地方。你怎么看?定义项目需要哪些语言特性?
上面暗示的是 API 必须是可用的。层层叠叠的样板是不可接受的。