如何将扫描的初始值设置为列表?

How do I set initial value of a scan to be a list?

我正在尝试做:

(.5 .5) (+\) (.9 .2;.4 .1)

预期结果:

1.4 0.7
1.8 0.8

但我得到的是 'type

我似乎无法使用列表作为最左边的参数。我做错了什么?

q)(+\)[0.5 0.5;(.9 .2;.4 .1)]
1.4 0.7
1.8 0.8

你的表达式在没有括号的情况下工作正常:

q).5 .5 +\ (.9 .2;.4 .1)
1.4 0.7
1.8 0.8

如您所见,您可以使用列表作为左参数。但是标量扩展意味着您不需要。

q).5 +\ (.9 .2;.4 .1)
1.4 0.7
1.8 0.8

说明 您想要列表中的累计金额:

q)sums (.9 .2;.4 .1)
0.9 0.2
1.3 0.3

然后是一些:

q).5 + sums (.9 .2;.4 .1)
1.4 0.7
1.8 0.8

但是您已经对此进行了更深入的了解。 sums 是派生函数 Add Scan +\ 的语法糖。派生函数是 variadic - 可以作为一元或二进制应用 - sums 仅适用于一元应用。当 Add Scan 作为二进制应用时,它的左参数是一个初始值。

q).5 +\ (.9 .2;.4 .1)
1.4 0.7
1.8 0.8

当正确的参数是一个长列表时,指定一个初始值比之后将其添加到每个累积和更有效。

q)show L:1000000?1.
0.3927524 0.5170911 0.5159796 0.4066642 0.1780839 0.3017723 0.785033 0.5347096 0.711171..
q)\ts:1000 .5+sums L
2360 16777472
q)\ts:1000 .5+\ L
1477 8388880

那些括号 如前所述,派生函数 +\ 是可变的。

q)5+ 2 3  / +\ applied as a binary
6 8 11

要将其作为一元应用,请使用括号表示法 +\[1 2 3] 或在括号中“捕获”它。直接效果是阻止它的应用。您现在有一个数据项。它具有“名词语法”,可以作为参数传递。

q)type(+\)
108h

但是 q 语法允许您通过并列来应用名词。 对于名词 NN x 等价于 N@xN[x].

q)"abc" 2 0
"ca"
q)til 3
0 1 2
q)(+\)1 2 3  / +\ applied as a unary
1 3 6