Viene dalla prospettiva dei big data. Fondamentalmente, molti framework (come Apache Spark) "compensano" la mancanza di operazioni relazionali fornendo interfacce tipo Functor / Monad e c'è un movimento simile verso conversioni da gatti a SQL (Slick in Scala). Ad esempio, abbiamo bisogno di un join naturale (supponendo che non vi siano ripetizioni sugli indici) per la moltiplicazione dei vettori dal punto di vista SQL, che potrebbe essere considerata come zip + map(multiply)
(il MLib di Spark, tuttavia, ha già ElementwiseProduct
) nelle applicazioni della teoria delle categorie.
Semplicemente dicendo (i seguenti esempi sono in Scala):
la sottocassa referenziata di join può essere pensata come funzione applicativa (sopra una raccolta ordinata), che a sua volta ci dà
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)
. Inoltre, possiamo indurlo ad alcuni altri join, assumendo un po 'di preelaborazione (groupBy
operatore o solo surjection, o in generale - un epimorfismo).altri join e selezioni possono essere considerati monadi. Ad esempio,
WHERE
è solo:List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty)
->List(1,2,2,4).filter(_ < 3)
i dati in sé sono solo ADT (anche GADT?), che a sua volta sembra una semplice categoria di set (o più in generale - cartesiana-chiusa), quindi dovrebbe (suppongo) coprire operazioni basate su set (a causa di Curry- Howard-Lambek stesso) e anche operazioni simili
RENAME
(almeno nella pratica).aggregazione corrisponde a
fold/reduce
(catamorfismo)
Quindi, quello che sto chiedendo è che possiamo costruire un isomorfismo tra (forse sottoinsieme di) teoria delle categorie e (l'intera) algebra relazionale o c'è qualcosa da scoprire? Se funziona, quale "sottoinsieme" esatto di categorie è isomorfo della relalgebra?
Puoi vedere che i miei presupposti sono piuttosto ampi mentre soluzioni formali come la corrispondenza Curry-Howard-Lambek per la logica-gatti-lambda sono più precise - quindi in realtà, sto chiedendo un riferimento a uno studio compiuto (che mostra una relazione diretta ) con altri esempi in Scala / Haskell.
Modifica : la risposta accettata mi ha fatto pensare che sono andato troppo lontano rappresentando join e condizioni come una monade (specialmente usando un valore vuoto che istanzia efficacemente FALSE), penso che i pullback dovrebbero bastare almeno per il sottoinsieme relalgebra di SQL. Le monadi sono migliori per oggetti di ordine superiore (nidificazione) come GROUP BY, che non fa parte della relalgebra.