KDB中每个和桃子的行为不一致

时间:2014-04-24 20:08:02

标签: kdb

作为一个最小的例子,例如,如果我有:

q) x:flip `a`b!(enlist 1;enlist 2);
q) y:flip `c`d!(enlist 3;enlist 4);
q) (raze x), (raze y)
`a`b`c`d!1j 2j 3j 4j   # works as expected

但涉及peach

q) {(raze x), (raze y)} peach x
enlist 1j 2j   # I was expecting `a`b`c`d!1j 2j 3j 4j

输出中没有3j 4j - 为什么我的raze y被忽略了?

实际上,each也提供了不同的输出

q) {(raze x), (raze y)} each x
({:(raze x), (raze y);}';flip `a`b!(enlist 1j;enlist 2j))

我认为peach只是each的并行版本,所以两者都应该相同......

发生了什么?

2 个答案:

答案 0 :(得分:3)

这不是桃子和每个人的不一致行为。

首先,kdb中的函数将隐式参数设为x,y,z(如果未指定任何参数)。

     So f:{x+y}  is equivalent to f:{[x;y] x+y}
     But f:{[a;b] a+b} will not have x,y,z as implicit parameter

有关详细信息,请参阅http://code.kx.com/q4m3/6_Functions/#617-implicit-parameters

中的隐式参数部分

桃子案例  当你做 {(raze x),(raze y)} peach x

i)编写此函数的另一种方法是:

    f:{[x;y] (raze x),(raze y)} 
    And call is like:  f[;] peach x

所以你将全局x传递给函数的局部x,但是y中没有任何东西,这就是为什么你只得到输出中的1和2而不是3& 4。

ii)为什么输出中只有1和2而不是a b!1 2?    当您将表的每一行(在您的情况下为x)传递给函数时,它将以字典的形式传递。字典上的raze只给出值。

你必须修改你的功能才能正常工作(使用每一个):

             flip {x,y}' [x;y]

'都是,当你有多个参数并且想要同时应用它们时,会使用。

这将从全局x和y一次一行,并以字典形式将其复制到本地x和y,然后加入它们。

每个案例:

每个只是给你一个消息,你的函数需要2个参数,因此无法执行它。

为什么Peach工作,而每个人都没有?

Peach和Every在某些情况下并不相同。 当你有二元函数时,桃子的工作方式就像每个先前(':)而不是每个。 它们仅对于monadic函数是相同的。在你的情况下,你有二元功能。

答案 1 :(得分:1)

x和y可以是函数的隐式参数。使用x和y作为列表​​变量的名称是令人困惑的,不推荐使用。

要清楚说明发生了什么,请考虑重命名变量a,b:

q)a:flip `a`b!(enlist 1;enlist 2);
q)b:flip `c`d!(enlist 3;enlist 4);
q)(raze a), (raze b)
a| 1
b| 2
c| 3
d| 4
q){(raze a), (raze b)} peach x
a b c d
-------
1 2 3 4

您可以通过此示例查看peach / each如何处理隐式函数参数:

Q)X:x q)y:ý

q){(x; y)}每个1 {(X; Y)}' [1] q){(x; y)}桃1 1

我无法确定你想要的行为,所以我能做的就是指出为什么会出现问题。

相关问题