KDB中函数多参数传递问题:Lambda函数传数字与符号变量报错
关于KDB+中多参数函数与Lambda批量传参的问题解答
第一个问题:KDB+是否支持向函数传递多个参数?
当然可以!KDB+完全支持多参数函数,不管是自定义命名函数还是匿名lambda函数,都能接收多个参数。举个简单的例子:
// 定义一个两参数的普通函数 addTwo:{[x;y] x + y} // 直接调用 addTwo[3;5] // 输出:8 // 直接用lambda调用两参数 {[a;b] a * b}[2;6] // 输出:12
你之前的困惑应该是出在批量应用多参数函数(比如用each)时的参数结构问题,而非函数本身不支持多参数。
第二个问题:Lambda函数传递两个变量的正确姿势
你写的代码{[x;y] // some calculation with x and y } each ((til 5) ,\:/: abcdf)报错,核心原因是each的工作机制:each`默认是给函数传递单个参数,而你的lambda需要两个参数。
你用,\:/:生成的是一个二维列表(每个子元素是(x;y)这样的元组),但each会把每个子元组当成一个整体传给lambda,导致lambda只收到了第一个参数(元组本身),缺少第二个参数,所以报错。
解决这个问题有几种常用方法:
方法1:用peach(并行each)处理多参数批量应用
peach是专门为多参数函数设计的批量应用工具,它会自动把每个元组拆成多个参数传给函数:
// 示例:计算x加上y的长度 {[x;y] x + count y} peach til 5,/:\:`a`b`c`d`f
方法2:先整理参数为元组列表,再用@'(apply each)
你也可以先用cross生成所有(x,y)的元组对,然后用@'逐个传递参数:
// 生成所有参数对的元组列表 params: til 5 cross `a`b`c`d`f // 用apply each传递参数 {[x;y] x + count y} @' params
方法3:调整lambda接收单个元组参数并解构
如果不想用peach或@',也可以修改lambda让它接收单个元组参数,再解构出x和y:
{[pair] pair[0] + count pair[1]} each ((til 5) ,\:/: `a`b`c`d`f)
不过这种写法不如前两种直观,一般更推荐前两种方法。
内容的提问来源于stack exchange,提问作者delita
相关产品推荐
相关产品推荐

