实现关系代数的语言特性
Posted
技术标签:
【中文标题】实现关系代数的语言特性【英文标题】:Language features to implement relational algebra 【发布时间】:2010-09-15 06:59:18 【问题描述】:我一直在尝试在 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 必须是可用的。层层叠叠的样板是不可接受的。
【问题讨论】:
HaskellDB 有一些想法如何创建类型安全的关系代数 DSL,您可能会发现它很有用。 【参考方案1】:您的要求是能够在结构上将类型定义为其他两种类型(原始关系和投影定义)的差异。老实说,我想不出任何语言可以让你这样做。类型可以在结构上累积 (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
。第一个是投影等效于输入类型,这意味着它是无操作的 (SELECT *
)。第二个是说投影是输入类型中包含的单个字段。第三个是棘手的。意思是您允许声明某些匿名类型 $_1
,它与输入类型没有 static 关系。大概它将由委托给输入类型的字段组成,但我们不能强制执行。这大致就是 LINQ 所采取的策略。
很抱歉,我无法提供更多帮助。我希望可以按照您的要求进行操作,这会带来很多非常巧妙的可能性。
【讨论】:
我希望你能提供给我一些密钥来解密你在第二段中写的内容..【参考方案2】:我想我已经决定只使用正常的设施来收集项目部分的地图。客户端只需指定一个函数[T<:Tuple](t:T) => P
通过一些 java 技巧来获取 P 的类,我应该能够使用反射来实现查询逻辑。
对于join,我可能会使用DynamicProxy来实现映射功能。
作为奖励,我也许可以让 API 与 Scalas 特殊的 for 语法一起使用。
【讨论】:
以上是关于实现关系代数的语言特性的主要内容,如果未能解决你的问题,请参考以下文章