我一直在尝试在Scala中对关系代数进行编码(据我所知,它具有最先进的类型系统之一)并且似乎找不到找到我想要的方法.
由于我不熟悉编程语言设计的学术领域,我真的不知道要寻找什么功能.
那么,为了实现静态验证的关系代数,需要哪些语言功能以及具有这些功能的语言?
一些要求:元组是一个函数,它将名称从有问题的元组的静态定义的有效名称集合映射到名称指定的类型的值.让我们调用这个名称类型设置域名.
Relation是一组具有相同域的元组,因此任何元组的范围在Set中都是唯一的
到目前为止,该模型可以简单地通过Scala建模
trait Tuple trait Relation[TTuple中的vals,vars和defs是上面定义的名称类型集.但是在Tuple中应该有两个同名的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必须可用.层板和样板层是不可接受的.
1> Daniel Spiew..:您要求的是能够在结构上将类型定义为两种其他类型(原始关系和投影定义)的差异.老实说,我想不出任何可以让你这样做的语言.类型可以是在结构上累积的(
A with B
),因为A with B
是一个结构子型两者的A
和B
.但是,如果你想想看,一个类型的操作A less B
实际上是一个超的A
,而不是一个子类型.你在自然协变类型上要求一个任意的,逆变的类型关系.甚至还没有证明某种事物是名义存在类型的声音,更不用说结构声明点类型.我之前已经开始进行这种建模,我采用的路线是将投影约束到三个域中的一个:
P
==T
,P
=={F} where F in T
,P
=={$_1} where $_1 anonymous
.第一个是投影等效于输入类型,这意味着它是一个no-op(SELECT *
).第二个是说投影是输入类型中包含的单个字段.第三个是棘手的.它是说你允许声明一些与输入类型$_1
没有静态关系的匿名类型.据推测,它将包含委托给输入类型的字段,但我们无法强制执行.这大致是LINQ采取的策略.对不起,我无法提供更多帮助.我希望有可能做你所要求的,它会打开很多非常简洁的可能性.