Я пытался закодировать реляционную алгебру в Scala (которая, насколько мне известно, имеет одну из самых продвинутых систем типов) и, похоже, просто не нашел способ добраться туда, куда я хочу.
Поскольку я не очень разбираюсь в академической области проектирования языков программирования, я действительно не знаю, какую функцию искать.
Итак, какие языковые функции потребуются и какой язык имеет эти функции для реализации статически верифицируемой реляционной алгебры?
Некоторые из требований: Кортеж — это функция, отображающая имена из статически определенного набора допустимых имен для рассматриваемого кортежа в значения типа, указанного именем. Давайте назовем этот набор имен доменом.
Отношение — это множество кортежей с одним и тем же доменом, так что диапазон любого кортежа уникален в множестве.
Пока что модель можно легко смоделировать в Scala, просто
trait Tuple
trait Relation[T<Tuple] extends Set[T]
vals, vars и defs в Tuple — это набор типов имен, определенный выше. Но в Tuple не должно быть двух определений с одинаковым именем. Также vars и нечистые определения, вероятно, тоже должны быть ограничены.
Теперь о сложной части:
Соединение двух отношений — это отношение, в котором домен кортежей представляет собой объединение доменов из кортежей операндов. Таким образом, сохраняются только кортежи, имеющие одинаковые диапазоны пересечения их доменов.
def join(r1:Relation[T1],r2:Relation[T2]):Relation[T1 with T2]
должен сделать трюк.
Проекция отношения — это отношение, в котором домен кортежей является подмножеством домена кортежей операндов.
def project[T2](r:Relation[T],?1):Relation[T2>:T]
Здесь я не уверен, что вообще возможно найти решение. Что вы думаете? Какие языковые функции необходимы для определения проекта?
Вышеизложенное подразумевает, что API должен быть пригодным для использования. Слои и слои шаблона не приемлемы.