Orm 实现关系代数的语言特性

Orm 实现关系代数的语言特性,orm,scala,dsl,type-systems,database-relations,Orm,Scala,Dsl,Type Systems,Database Relations,我一直在尝试用Scala对关系代数进行编码(据我所知,Scala拥有最先进的类型系统之一),但似乎没有找到一种方法来达到我想要的目的 由于我在编程语言设计的学术领域没有那么丰富的经验,我真的不知道该寻找什么特性 那么,为了实现静态验证的关系代数,需要哪些语言特性,以及哪些语言具有这些特性呢 其中一些要求: 元组是一个函数,它将名称从相关元组的静态定义的有效名称集映射到名称指定的类型的值。让我们调用此名称类型来设置域 关系是一组具有相同域的元组,使得任何元组的范围在该集中都是uniqe 到目前为止

我一直在尝试用Scala对关系代数进行编码(据我所知,Scala拥有最先进的类型系统之一),但似乎没有找到一种方法来达到我想要的目的

由于我在编程语言设计的学术领域没有那么丰富的经验,我真的不知道该寻找什么特性

那么,为了实现静态验证的关系代数,需要哪些语言特性,以及哪些语言具有这些特性呢

其中一些要求: 元组是一个函数,它将名称从相关元组的静态定义的有效名称集映射到名称指定的类型的值。让我们调用此名称类型来设置域

关系是一组具有相同域的元组,使得任何元组的范围在该集中都是uniqe

到目前为止,该模型可以在Scala中简单地通过

trait Tuple
trait Relation[T<Tuple] extends Set[T]
我们应该做到这一点

关系的投影是一种关系,其中元组的域是操作数元组域的子集

def project[T2](r:Relation[T],?1):Relation[T2>:T]
这就是我不确定是否有可能找到解决方案的地方。你怎么认为?定义项目需要哪些语言功能


当然,上面暗示的是API必须是可用的。样板文件的层和层是不可接受的。

您要求的是能够在结构上将一个类型定义为其他两个类型(原始关系和投影定义)的差异。老实说,我想不出任何语言能让你这么做。类型可以在结构上累积(
A与B
),因为
A与B
都是
A
B
的结构子类型。但是,如果您仔细想想,类型操作
a减去B
实际上是
a
的超类型,而不是子类型。你要求的是自然协变类型上的任意、逆变类型关系。它甚至还没有被证明,这种事情是健全的名义存在类型,更不用说结构声明点类型

我以前做过这种建模,我采用的方法是将投影约束到三个域中的一个:
p
=
T
p
=
{F}其中F在T
p
=
{code>{u 1}其中$\u 1匿名
。第一个是投影与输入类型等效,这意味着它是一个无操作(
SELECT*
)。第二种说法是投影是输入类型中包含的单个字段。第三个是棘手的问题。这意味着您允许声明与输入类型没有静态关系的匿名类型
$\u 1
。据推测,它将由委托给输入类型的字段组成,但我们不能强制执行。这大概就是LINQ采取的策略


对不起,我帮不上忙了。我希望能够按照您的要求去做,这将打开许多非常简洁的可能性。

与语言的关系理论一样简单,也最接近。

我想我已经决定只使用常规的工具来为项目部分绘制集合。客户端只需指定一个函数
[tp

通过一些java技巧来获得p类,我应该能够使用反射来实现查询逻辑

对于join,我可能会使用DynamicProxy来实现映射函数


作为奖励,我可能能够使API与Scalas special for syntax一起使用。

对如何创建类型安全的关系代数DSL有一些想法,您可能会发现它很有用。

也许您会从这里发现smth很有用:


它显示了如何添加“分组依据”和“订单依据”列出理解。

我希望你能提供一些关键信息,让我理解你在第二段中所写的内容。教程D是我的灵感来源。但我希望避免编写新的语言,而只是将API嵌入一些GP语言中。在这种情况下,Scala。不过,为Scala编写复印机插件是我的目标。即使如此我想把它作为一个更通用的工具,而不仅仅是一个教程d编译器。
def project[T2](r:Relation[T],?1):Relation[T2>:T]