4

我有这个功能f

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

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

4

2 回答 2

6

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

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

于 2016-08-02T13:58:23.600 回答
4

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

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 个参数。

因此,现在以您的示例为例并应用上述两个概念,由于投影,内部函数最终将变为二元函数,然后最终“过度”函数适用于这个新的二元函数。我们可以将函数重写为:

f:{
f3:{z+x*y};
f2:f3[x];
f2/y
}
于 2016-08-02T14:45:03.733 回答