深入索引字典,两个案例

Indexing dictionary in depth, two cases

当深入索引字典时,我发现在相同的(我认为的)结构中有不同的结果:

q)d:`a`b!(1 2 3;4 5 6)
q)d[`a`b;0]
1 4
q)d[`a`b]0
1 2 3

为什么会这样? q 如何理解和区分两种不同的情况?在此之前我确信,例如,调用二元函数 f[a;b]f[a]b 是相同的。现在我连这个都不确定。

要进行深度索引,您需要用分号分隔参数,或者使用点。你的第二个例子,

d[`a`b] 0

从字典值中取出 2 个列表,然后索引到第一个列表 return。 而

d[`a`b;0]

 d .(`a`b;0)

正在获取 2 个列表,然后在深度索引,获取每个列表的第一个元素,由于半 colon/dot

当你调用二元函数时,它需要两个参数,在方括号内传递一个参数会创建一个投影,这基本上是使用隐式分号,所以

f[a]b

相同
f[a;]b

相同
f[a;b]

结果

f[a]

是一个需要另一个参数的投影,所以

f[a] b

计算 f[a],然后将参数 b 传递给此函数,通过并置

使用通常的函数应用程序

您的字典索引示例没有创建投影,因此索引不需要更多参数,因此第一个索引

d[`a`b]

立即求值给出一个结果,然后将第二个索引应用到这个结果上。 对于 monadic function

也是一样的
q){5+til x}[5] 2
7

和顶级字典索引一样,进行应用,然后对结果进行索引,因为只需要一个参数,不涉及投影

编辑 - Adam 先于我!

我认为您不能将函数调用 f[a;b]f[a]b 视为等同于索引。 f[a]b 对于一个函数来说是一个投影,但你不能以同样的方式投影索引。函数具有固定价,也就是固定数量的输入,但可以在任何深度进行索引。

如果你把你的字典编造得更深,你会发现你可以让索引越来越深:

q)d:{`a`b!2#enlist value x}/[1;d]
q)d[`a`b;1;1]
5 5
q)d:{`a`b!2#enlist value x}/[2;d]
q)d[`a`b;1;1;1;1]
5 5
q)d:{`a`b!2#enlist value x}/[2;d]
q)d[`a`b;1;1;1;1;1;1]
5 5

然而您仍然可以仅在顶层建立索引 d[`a`b]。所以解释器必须决定它的索引是在顶层,也就是 d @ `a`b 还是深度索引 d . (`a`b;0).

为避免混淆,如果您提供一级索引,它会在顶层建立索引;如果您提供多于一个级别的索引,它会在深度建立索引。因此没有预测(至少不是以相同的方式)。

并且如上所述,函数没有这种歧义,因为它们具有固定数量的参数,因此可以投影。

这里发生的事情是 d[`a`b] 有 depth/valence 作为 d。因此,当您应用 d[`a`b]0 时,零不会在深度处进行索引。如果您不索引字典的多个值,您将获得预期的结果:

q)d[`a`b;0]~d[`a`b][0]
0b
q)d[`a;0]~d[`a][0]
1b
q)d[`b;0]~d[`b][0]
1b

如果您改为考虑与原始示例具有相同行为的 2x3 矩阵,这会更清楚

q)M:(1 2 3;4 5 6)
q)M[0 1;0]
1 4
q)M[0 1][0]
1 2 3

索引任何一行会产生一个简单的向量

q)type M[0]
7h
q)type M[1]
7h

但是索引多行会产生一个矩阵:

q)type M[0 1]
0h

事实上,索引两行会得到完全相同的矩阵

q)M~M[0 1]
1b

所以我们应该期待

q)M[0]~M[0 1][0]
1b

如上所示。

None 这应该对调用二元函数有影响,因为提供一个参数显式导致函数投影,因此价总是降低。

q)type {2+x*y}
100h
q)type {2+x*y}[10]
104h