如何理解 returns 两个元素列表的副词/二元函数?

How to understand an adverb / for dyadic function that returns a list of two elements?

问题出自an example found in this article,移位函数:

shift: {[t;c]{(0,t*x)+x,y}/c}

为了了解到底发生了什么,我试图简化这个函数。假设 t:1c:1 2 3。然后似乎函数 {(0,x)+x,y}/1 2 3{(0,x)+(x,y)}/1 2 3 相同,与 {(x,y+x)}/1 2 3.

相同

但事实并非如此:

q){(0,x)+x,y}/1 2 3
1 4 6
q){(0,x)+(x,y)}/1 2 3
1 4 6
q){(x,y+x)}/1 2 3
1 3 4 6

所以很明显这种简化做了一些不同的事情,而且我对某些概念的理解存在差距。

能否指出我的错误 - 为什么 (0,x)+(x,y)(x,y+x) 不同?

当以这种方式扫描时,每次迭代的输出都用作下一次的 x 变量。我强烈建议阅读有关 accumulators. The nature of how binary accumulators works is demonstrated nicely in the whitepaper on iterators

的文档
r[0]:f[x;   y 0; z 0]
r[1]:f[r 0; y 1; z 1]
r[2]:f[r 1; y 2; z 2]

因此对于您的情况,重要的区别在于 (0,x)+(x,y) 是两个向量的相加,(x,y+x) 是两个原子的相加。考虑第二次迭代,其中对于您创建的所有 lambda,x 是 (1,3),y 是 2。我们可以使用 0N!

公开值是什么
q)x:1 3
q)y:2
q)(0,x)+(x,y)
1 4 5
q)(0N!0,x)+(0N!x,y)
1 3 2
0 1 3
1 4 5
q)(x),(y+x)
1 3 3 5
q)(0N!x),(0N!y+x)
3 5
1 3
1 3 3 5

所以最终的 lambda 正在创建更长的向量,因为它本质上是连接两个长度为 x 的向量,并且 x 的长度每次迭代都会增加。

如果你想更好地理解迭代器,你可以使用\

输出中间结果
q){(0,x)+(x,y)}\[1 2 3 4]
1
1 3
1 4 6
1 5 10 10
q){x,(y+x)}\[1 2 3 4]
1
1 3
1 3 4 6
1 3 4 6 5 7 8 10

因此对于两个 lambda 表达式,前两个输出是相同的。第一个只是输出第一个输入 x,第二个是连接第一个输入和第二个输入,它们的长度相同。

所以这里最大的收获是过去的输出用于下一次迭代,每次迭代都贯穿最终值

(0,x)+(x,y) 只有一种情况与 (x,y+x) 相同,即 xy 是原子。当 x 成为一个列表时,就会发生这种情况,比如 3 个元素:

 0,    x1,    x2,   x3 +
x1,    x2,    x3,    y =
x1, x1+x2, x2+x3, x3+y

x1, x2, x3, y+x1, y+x2, y+x3

转向矢量思维,耶!