Это происходит с точки зрения больших данных. По сути, многие фреймворки (например, Apache Spark) «компенсируют» отсутствие реляционных операций, предоставляя интерфейсы, подобные Functor / Monad, и наблюдается аналогичное движение к преобразованию кошек в SQL (Slick in Scala). Например, нам нужно естественное соединение (при условии отсутствия повторений в индексах) для поэлементного умножения векторов с точки зрения SQL, которое можно рассматривать как zip + map(multiply)
(однако у Spark MLib уже есть ElementwiseProduct
) в приложениях теории категорий.
Проще говоря (следующие примеры в Scala):
указанный подслучайный пример объединения можно рассматривать как аппликативный функтор (над отсортированной коллекцией), который, в свою очередь, дает нам
zip
:List(1,2,3).ap(List(2,4,8).map(a => (b: Int) => a * b))
->(List(1,2,3) zip List(2,4,8)).map(x => x._1 * x._2)
. Более того, мы можем склонить его к некоторым другим соединениям, предполагая некоторую предварительную обработку (groupBy
оператор или просто выделение, или вообще - эпиморфизм).другие соединения и выбор можно считать монадой. Например,
WHERE
просто:List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty)
->List(1,2,2,4).filter(_ < 3)
сами данные - это просто ADT (тоже GADT?), который, в свою очередь, выглядит как простая категория Set (или, в более общем смысле, декартово-замкнутая), поэтому он должен (я полагаю) охватывать операции на основе множеств (из-за Curry- Сам Говард-Ламбек), а также подобные операции
RENAME
(по крайней мере, на практике).агрегация соответствует
fold/reduce
(катаморфизм)
Итак, я спрашиваю, можем ли мы построить изоморфизм между (возможно, подмножеством) теории категорий и (всей) реляционной алгеброй или есть что-то открытое? Если это работает, какое точное «подмножество» категорий изоморфно релалгебре?
Вы можете видеть, что мои собственные предположения довольно широки, в то время как формальные решения, такие как соответствие Карри-Говарда-Ламбека для логики-кошки-лямбда, являются более точными - поэтому на самом деле, я прошу ссылку на завершенное исследование (которое показывает прямую связь ) с большим количеством примеров в Scala / Haskell.
Изменить : принятый ответ заставил меня думать, что я зашел слишком далеко, представляя соединения и условия как монаду (особенно используя пустое значение, которое эффективно создает FALSE), я думаю, что откатов должно быть достаточно, по крайней мере, для поднабора Relalgebra в SQL. Монады лучше подходят для вещей высшего порядка (вложенности), таких как GROUP BY, которые не являются частью релалгебры.