深度索引字典,两种情况

问题描述

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

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个列表,然后索引以返回第一个。 虽然

d[`a`b;0]

 d .(`a`b;0)

由于是半冒号/点,所以正在获取2个列表,然后进行深度索引,并取每个列表的第一个元素

调用二进位函数时,它需要两个参数,在方括号内传递一个将创建一个投影,该投影基本上使用隐式的半冒号,因此

f[a]b

相同
f[a;]b

相同
f[a;b]

结果

f[a]

是一个期望有另一个参数的投影,所以

f[a] b

计算f [a],然后将参数b传递给该函数,并通过并置使用通常的函数

您的字典索引示例不会创建投影,因此索引不再需要其他参数,因此第一个索引

d[`a`b]
立即评估

得出结果,然后将第二个索引应用于该结果。 一元函数的工作原理相同

q){5+til x}[5] 2
7

像顶级字典索引一样,先执行应用程序,然后对结果进行索引,因为只希望有一个自变量,而不涉及投影

,

编辑-亚当击败了我!

我认为您不能认为函数调用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]的深度/化合价为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

如上所述。

这都不会对调用二进位函数产生影响,因为显式提供一个参数会导致函数投影,因此价数始终会降低。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...