Itu datang dari perspektif big data. Pada dasarnya, banyak kerangka kerja (seperti Apache Spark) "mengimbangi" kurangnya operasi relasional dengan menyediakan antarmuka seperti Functor / Monad dan ada gerakan serupa menuju konversi kucing ke SQL (Slick in Scala). Misalnya, kita perlu penggabungan alami (dengan asumsi tidak ada pengulangan pada indeks) untuk perkalian elemen-bijaksana vektor dari perspektif SQL, yang dapat dianggap sebagai zip + map(multiply)
(Spark's MLib, bagaimanapun, sudah memiliki ElementwiseProduct
) dalam aplikasi Kategori Teori.
Cukup dengan mengatakan (contoh-contoh berikut ada di Scala):
subkumpulan referens yang direferensikan dapat dianggap sebagai functor aplikatif (koleksi berlebihan), yang pada gilirannya memberi kita
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)
. Selain itu, kami dapat mendorongnya ke beberapa bergabung lain, dengan asumsi beberapa preprocessing (groupBy
operator atau hanya surjection, atau umumnya - sebuah epimorfisme).bergabung dan seleksi lainnya dapat dianggap sebagai monad. Misalnya
WHERE
saja:List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty)
->List(1,2,2,4).filter(_ < 3)
data itu sendiri hanya ADT (GADT juga?), yang pada gilirannya terlihat seperti Set-kategori sederhana (atau lebih umum - Cartesian-closed), jadi harus (saya kira) mencakup operasi berbasis Set (karena Curry- Howard-Lambek sendiri) dan juga operasi suka
RENAME
(setidaknya dalam praktek).agregasi sesuai dengan
fold/reduce
(catamorphism)
Jadi, yang saya tanyakan adalah dapatkah kita membangun isomorfisme antara (mungkin subset dari) teori kategori dan aljabar relasional (keseluruhan) atau apakah ada sesuatu yang terbuka? Jika berhasil, "subset" kategori apa yang isomorfis terhadap relalgebra?
Anda dapat melihat bahwa asumsi saya sendiri cukup luas sementara solusi formal seperti korespondensi Curry-Howard-Lambek untuk logika-kucing-lambda lebih tepat - jadi sebenarnya, saya meminta referensi untuk penelitian yang dilakukan (yang menunjukkan hubungan langsung ) dengan lebih banyak contoh di Scala / Haskell.
Sunting : jawaban yang diterima membuat saya berpikir bahwa saya terlalu jauh mewakili gabungan dan kondisi sebagai monad (terutama menggunakan nilai kosong yang secara efektif instantiates FALSE), saya pikir pullback harus cukup setidaknya untuk subset relalgebra dari SQL. Monads lebih baik untuk barang-barang tingkat tinggi (bersarang) seperti GROUP BY, yang bukan bagian dari relalgebra.