如何从指定列表程序化生成Q语言嵌套函数表达式
程序化生成kdb+嵌套加法函数表达式
要基于列名列表rnk1rnk2rnk3rnk4生成目标嵌套加法表达式,有两种简洁的实现方式:
方法一:使用foldr折叠函数
foldr可以从右往左遍历列表,将元素依次组合成嵌套结构:
q)cols: `rnk1`rnk2`rnk3`rnk4 q)foldr[{(+;x;y)}; last cols; cols except last cols] (+;`rnk1;(+;`rnk2;(+;`rnk3;`rnk4)))
逻辑说明:以列表最后一个元素为初始值,依次将前面的每个元素与当前生成的表达式组合成(+; 元素; 当前表达式),最终得到嵌套的加法结构。
也可以用更简洁的投影写法:
q)foldr[(+;;)]; last cols; cols except last cols]
方法二:递归函数实现
定义递归函数,根据列表长度逐步构建嵌套表达式:
q)addExpr:{[cols] if[count cols=2; (+;cols[0];cols[1])]; (+;cols[0];addExpr[cols 1:]) } q)addExpr[`rnk1`rnk2`rnk3`rnk4] (+;`rnk1;(+;`rnk2;(+;`rnk3;`rnk4)))
逻辑说明:
- 当列表仅含2个元素时,直接返回基础加法结构
(+; 元素1; 元素2) - 列表长度大于2时,将第一个元素与剩余元素的递归组合结果拼接,生成嵌套结构
拼接完整函数式查询
将生成的加法表达式代入,即可得到完整的更新查询:
q)cols: `rnk1`rnk2`rnk3`rnk4 q)addExpr: foldr[{(+;x;y)}; last cols; cols except last cols] q)query: ![`t;();0b;(enlist`rnk)!enlist (%;addExpr;4)] q)query ![t;();0b;(,`rnk)!,((%;(+;`rnk1;(+;`rnk2;(+;`rnk3;`rnk4)));4)]
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

