Cela vient du Big Data. Fondamentalement, de nombreux frameworks (comme Apache Spark) "compensent" le manque d'opérations relationnelles en fournissant des interfaces de type Functor / Monad et il existe un mouvement similaire vers les conversions de chats en SQL (Slick in Scala). Par exemple, nous avons besoin d'une jointure naturelle (en supposant qu'il n'y ait pas de répétitions sur les index) pour la multiplication par élément des vecteurs du point de vue SQL, qui pourrait être considérée comme zip + map(multiply)
(la MLib de Spark en a déjà ElementwiseProduct
) dans les applications de la théorie des catégories.
Dire simplement (les exemples suivants sont en Scala):
le sous-cas référencé de jointure peut être pensé comme foncteur applicatif (sur collection triée), ce qui à son tour nous donne
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)
. De plus, nous pouvons l'induire à d'autres jointures, en supposant un prétraitement (groupBy
opérateur ou simplement surjection, ou généralement - un épimorphisme).les autres jointures et sélections peuvent être considérées comme une monade. Par exemple,
WHERE
c'est juste:List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty)
->List(1,2,2,4).filter(_ < 3)
les données elles-mêmes sont juste ADT (GADT aussi?), qui à son tour ressemble à une simple catégorie Set (ou plus généralement - cartésienne fermée), donc elle devrait (je suppose) couvrir les opérations basées sur Set (en raison de Curry- Howard-Lambek lui-même) et aussi des opérations comme
RENAME
(au moins dans la pratique).l'agrégation correspond à
fold/reduce
(catamorphisme)
Donc, ce que je demande, c'est peut-on construire un isomorphisme entre (peut-être un sous-ensemble de) la théorie des catégories et (toute) l'algèbre relationnelle ou y a-t-il quelque chose à découvrir? Si cela fonctionne, quel "sous-ensemble" exact de catégories est isomorphe à la relalgèbre?
Vous pouvez voir que mes propres hypothèses sont assez larges tandis que les solutions formelles comme la correspondance Curry-Howard-Lambek pour logic-cats-lambda sont plus précises - donc en fait, je demande une référence à une étude accomplie (qui montre une relation directe ) avec plus d'exemples dans Scala / Haskell.
Edit : la réponse acceptée m'a fait penser que j'allais trop loin en représentant les jointures et les conditions en tant que monade (en particulier en utilisant une valeur vide qui instancie efficacement FALSE), je pense que les retraits devraient suffire au moins pour le sous-ensemble de relalgebra de SQL. Les monades sont meilleures pour les trucs d'ordre supérieur (imbrication) comme GROUP BY, qui ne fait pas partie des relalgebra.