KDB和x2B/问:关于内部函数中未使用的参数

KDB和x2B/问:关于内部函数中未使用的参数,kdb,k,Kdb,K,我有这个函数f f:{{z+x*y}[x]/[y]} 我可以在没有第三个参数的情况下调用f,我得到了这个参数,但是内部{z+x*y}如何在没有第三个参数的情况下完成呢?kdb将假设,如果给一个包含两个参数的函数一个列表,您希望第一个是x,其余的是y(在over and scan的上下文中,而不是一般情况下)。例如: q){x+y}/[1;2 3 4] 10 也可以通过以下方式实现: q){x+y}/[1 2 3 4] 10 这可能就是您的示例中发生的情况 编辑: 特别是,您可以像这样使用此

我有这个函数
f

f:{{z+x*y}[x]/[y]}

我可以在没有第三个参数的情况下调用
f
,我得到了这个参数,但是内部
{z+x*y}
如何在没有第三个参数的情况下完成呢?

kdb将假设,如果给一个包含两个参数的函数一个列表,您希望第一个是x,其余的是y(在over and scan的上下文中,而不是一般情况下)。例如:

q){x+y}/[1;2 3 4]
10
也可以通过以下方式实现:

q){x+y}/[1 2 3 4]
10
这可能就是您的示例中发生的情况

编辑:

特别是,您可以像这样使用此函数

q){{z+x*y}[x]/[y]}[2;3 4 5 6]
56
这相当于(由于x的投影):

这相当于(根据我上面的原始观点):


这解释了为什么不需要“第三个”参数

您需要了解两件事:二元函数和投影的“结束”行为

1.了解二元函数的over/scan工作原理:

如果你有一个类似(x1,x2,x3)和函数“f”的列表,那么

f/(x1,x2,x3) ~  f[ f[x1;x2];x3]
所以在每次迭代中,它从列表中提取一个元素,该元素将是“y”,最后一次迭代的结果将是“x”。除了在第一次迭代中,第一个元素将是“x”,第二个元素将是“y”

例:

第一次迭代:x=4,y=5,结果=20

第二次迭代:x=20,y=6,结果=120

2.投影:

让我们以功能f3为例,它具有3个参数:

   q) f3:{[a;b;c] a+b+c}
现在我们可以通过固定(传递)一个参数将其投影到f2

  q)  f2:f3[4]   / which means=> f2={[b;c] 4+b+c}
所以f2现在是并矢的-它只接受2个参数

现在来看你们的例子,应用上面的两个概念,内部函数最终会因为投影而变成二元函数,最后“over”函数会在这个新的二元函数上工作。 我们可以将函数重写为:

f:{
f3:{z+x*y};
f2:f3[x];
f2/y
}

这很有帮助,但没有回答最初的问题啊,好吧,在这种情况下,它只是在执行函数之前返回种子作为第一个结果。看起来这是kdb执行此特殊操作时的默认行为case@zrb一个示例用法可能已经澄清了这一点,我的解释是有效的,这就是“结束”的行为/如果输入是二元函数的原子而不调用该函数,则返回atom。要在输出中获得投影,需要使用类似({x+y}/)[4;]这说明新函数现在需要一个list/atom。很有趣!谢谢!同意Terry的观点,一个示例调用会很有帮助。我也想将此标记为一个答案,但不允许这样。感谢你们两位Rahul和Terry。这非常有帮助
   q) f3:{[a;b;c] a+b+c}
  q)  f2:f3[4]   / which means=> f2={[b;c] 4+b+c}
f:{
f3:{z+x*y};
f2:f3[x];
f2/y
}