由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - SQL函数式编程的本质
进入Database版参与讨论
1 (共1页)
T*******x
发帖数: 8565
1
函数式编程的本质,well,有很多方面,从形式方面来说,就是没有mutable的变量。
可以有作为临时记录的变量,比如CTE记录一遍pass的结果,但是不能改,在此之上的
处理,如果要记录结果,必须记录为不同的名字,不能再重用这个名字。
其实程序的本质就是对初始数据一遍一遍的处理。大多数情况下,对数据处理一遍,记
录一个名字,在此之上再处理一遍,再记录一个名字,不需要复用前面的名字。唯一需
要复用前面的名字,也就是需要mutable变量的情况,是处理的遍数不确定,需要一个
循环,循环有一个结束条件,而不是固定遍数的。也就是说这个循环变量是需要
mutable的。
SQL查询中没有循环,而是以递归CTE代替循环。递归在形式上不是一个循环,因此也不需
要mutable循环变量。也就是说SQL只能进行函数式编程。但它也是图灵完备的了,也就
是其他通用编程语言能干的事,SQL查询也能干。这是对字符串,或者list of 字符串
的处理来说。
T*******x
发帖数: 8565
2
函数式编程的本质,well,有很多方面,从形式方面来说,就是没有mutable的变量。
可以有作为临时记录的变量,比如CTE记录一遍pass的结果,但是不能改,在此之上的
处理,如果要记录结果,必须记录为不同的名字,不能再重用这个名字。
其实程序的本质就是对初始数据一遍一遍的处理。大多数情况下,对数据处理一遍,记
录一个名字,在此之上再处理一遍,再记录一个名字,不需要复用前面的名字。唯一需
要复用前面的名字,也就是需要mutable变量的情况,是处理的遍数不确定,需要一个
循环,循环有一个结束条件,而不是固定遍数的。也就是说这个循环变量是需要
mutable的。
SQL查询中没有循环,而是以递归CTE代替循环。递归在形式上不是一个循环,因此也不需
要mutable循环变量。也就是说SQL只能进行函数式编程。但它也是图灵完备的了,也就
是其他通用编程语言能干的事,SQL查询也能干。这是对字符串,或者list of 字符串
的处理来说。
T*******x
发帖数: 8565
3
SQL因为加了recursive CTE,理论上它是图灵完备的了。因为它和通用编程语言比,唯
一欠缺的是循环。有了recursive CTE,就补上了循环。
SQL recursive CTE的实现,和通用编程语言的递归或者循环比,形式上都不完全一样
。当然了,谁说非要一样呢。这是一种设计,在语言条件限定下的一种解决方案。
SQL recursive CTE形式上是这样的:
with cte as (T union all A(cte))
形式上,cte是一个table,但是每次迭代,它都会变。用通用编程语言来看的话,最好
把它看成是一个函数,一个递归函数。一个函数每次迭代结果不同,这是合理的。
所以就这么看:见图。
1 (共1页)
进入Database版参与讨论