作为一个最小的例子,例如,如果我有:
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
的并行版本,所以两者都应该相同......
发生了什么?
答案 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
我无法确定你想要的行为,所以我能做的就是指出为什么会出现问题。