在kdb中向嵌套函数传递值列表的实现问题
Kdb+ 函数执行问题解决方案
原代码问题分析
你的代码存在两处关键问题,导致函数无法正常运行:
- 表
tab的第一列未指定列名,后续查询中引用a会报错; - 使用
each遍历list时,参数传递方式错误——部分应用后的.terry.func2[tab;;]需要两个参数,但each会把list中的每个二元组作为单个参数传入。
原修正后的代码(补全列名):
.terry.func:{ tab:([]a:`a`b`c;b:1 2 3;c:`MSFT`GLE`APPLE); list:((`a,'1);(`b,'2)); .terry.func2:{[t;x;y]select from t where a = x,b = y} [tab;;] each list; :.terry.func2 }
两种可行解决方案
方案一:用@'(Apply Each)解包二元组参数
将each替换为@',它会自动把list中每个二元组的两个元素分别作为参数传给部分应用后的函数:
.terry.func:{ tab:([]a:`a`b`c;b:1 2 3;c:`MSFT`GLE`APPLE); list:((`a,'1);(`b,'2)); .terry.func2:{[t;x;y]select from t where a = x,b = y} [tab;;] @' list; :.terry.func2 }
调用.terry.func[]会返回符合条件的表组成的列表:
+`a`b`c!(`a;1;`MSFT) +`a`b`c!(`b;2;`GLE)
方案二:调整list结构适配each
如果list是从其他表提取生成的,可以将其转为参数列表组(两列的表转置后),直接用each遍历:
.terry.func:{ tab:([]a:`a`b`c;b:1 2 3;c:`MSFT`GLE`APPLE); // 模拟从其他表提取数据生成参数组 otherTab:([]a:`a`b;b:1 2); list:flip otherTab; // 得到(`a`b;1 2),对应x和y的参数列表 .terry.func2:{[t;x;y]select from t where a = x,b = y} [tab] each list; :.terry.func2 }
核心注意事项
- 表的列名必须明确指定,避免默认列名导致的查询错误;
- 从其他表提取数据生成
list时,需确保参数结构与函数所需参数数量匹配:二元组列表用@',参数列表组用each。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

