KDB+/Q:关于内部函数中未使用的参数
KDB+/Q: About unused parameters in inner functions
我有这个功能f
f:{{z+x*y}[x]/[y]}
我可以在没有第三个参数的情况下调用 f
,我明白了,但是内部 {z+x*y}
如何在没有第三个参数的情况下完成?
kdb 将假设,如果给一个带有两个参数的函数的单个列表,您希望第一个为 x,其余为 y(在 over 和 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 的投影):
q){y+2*x}/[3 4 5 6]
56
这相当于(由于我上面的原始观点):
q){y+2*x}/[3;4 5 6]
56
这解释了为什么不需要 "third" 参数
您需要了解两件事:'over' 具有二元函数和投影的行为。
1.了解 over/scan 如何作用于二元函数:
http://code.kx.com/q/ref/adverbs/#over
如果你有像 (x1,x2,x3) 这样的列表和函数 'f' 那么
f/(x1,x2,x3) ~ f[ f[x1;x2];x3]
因此在每次迭代中,它从列表中取一个元素 'y',最后一次迭代的结果将是 'x'。除了在第一个元素将是 'x' 和第二个 'y'.
的第一次迭代中
例如:
q) f:{x*y} / call with -> f/ (4 5 6)
第一次迭代: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
}
我有这个功能f
f:{{z+x*y}[x]/[y]}
我可以在没有第三个参数的情况下调用 f
,我明白了,但是内部 {z+x*y}
如何在没有第三个参数的情况下完成?
kdb 将假设,如果给一个带有两个参数的函数的单个列表,您希望第一个为 x,其余为 y(在 over 和 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 的投影):
q){y+2*x}/[3 4 5 6]
56
这相当于(由于我上面的原始观点):
q){y+2*x}/[3;4 5 6]
56
这解释了为什么不需要 "third" 参数
您需要了解两件事:'over' 具有二元函数和投影的行为。
1.了解 over/scan 如何作用于二元函数: http://code.kx.com/q/ref/adverbs/#over
如果你有像 (x1,x2,x3) 这样的列表和函数 'f' 那么
f/(x1,x2,x3) ~ f[ f[x1;x2];x3]
因此在每次迭代中,它从列表中取一个元素 'y',最后一次迭代的结果将是 'x'。除了在第一个元素将是 'x' 和第二个 'y'.
的第一次迭代中例如:
q) f:{x*y} / call with -> f/ (4 5 6)
第一次迭代: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
}