如何理解 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:1
和 c: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)
相同,即 x
和 y
是原子。当 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
转向矢量思维,耶!
问题出自an example found in this article,移位函数:
shift: {[t;c]{(0,t*x)+x,y}/c}
为了了解到底发生了什么,我试图简化这个函数。假设 t:1
和 c: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)
相同,即 x
和 y
是原子。当 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
转向矢量思维,耶!