它来自大数据角度。基本上,许多框架(如Apache Spark)通过提供类似Functor / Monad的接口来“补偿”缺乏关系操作,并且向cats到SQL的转换也有类似的趋势(Scala中的Slick)。例如,我们需要自然联接(假设索引上没有重复),以便从SQL角度对向量进行元素zip + map(multiply)
逐次乘法,这ElementwiseProduct
在类别理论的应用程序中可以被视为(但Spark的MLib已经拥有)。
简单地说(以下示例在Scala中):
引用的join子案例可以看作是应用函子(在有序集合上),这反过来又给我们
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
算符或仅仅是外推,或者通常是一种同形),我们可以将其引入其他联接。其他联接和选择可以认为是monad。例如,
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类别(或更笼统地说-笛卡尔封闭),因此(我想)它应该涵盖基于Set的操作(由于Curry- Howard-Lambek本身)以及类似的操作
RENAME
(至少在实践中如此)。聚集对应于
fold/reduce
(变形)
所以,我要问的是,我们可以在类别理论(也许是子类别理论)和(整个)关系代数之间建立同构吗?还是有发现的东西?如果可行,类别的什么同构子集与relalgebra同构?
您会看到我自己的假设是相当广泛的,而诸如逻辑-猫-lambda的Curry-Howard-Lambek对应之类的形式化解则更为精确-因此,实际上,我要求参考已完成的研究(该研究表明了直接的关系),以及Scala / Haskell中的更多示例。
编辑:接受的答案使我认为我将连接和条件表示为monad太过分了(尤其是使用有效实例化FALSE的空值),我认为回调至少应足以满足SQL的relegebra子集。Monad更适合诸如GROUP BY的高阶(嵌套)内容,这不是relalgebra的一部分。