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