为什么每个右边和每个左边 w.r.t 括号的使用有区别?

Why is there a difference between each-right and each-left w.r.t use of brackets?

我想为下面的 ccys 中的每个 ccy 自动创建一个包含 USDccy 和 ccyUSD 字符串的向量。我可以通过以下方式做到这一点。

ccys: `AUD`CAD`NZD;
ccysvec:`$("USD",/:string ccys), (string ccys),\:"USD";

但是,对于左边的部分,我注意到如果删除字符串 ccys 周围的括号,即

string ccys,\:"USD"

我得到以下与美元分开的。 result 即使右半部分的字符串 ccys 周围没有括号,类似的事情也不会发生。

你能帮我理解为什么吗?

kdb 从右到左执行,因此没有括号,每个左边都将符号列表 (ccys) 连接到一个字符串,从技术上讲,这是一个字符列表。

q)ccys,\:"USD"
`AUD "U" "S" "D"
`CAD "U" "S" "D"

each 权利不会发生这种情况,因为 ccys 将在连接之前转换为字符串,在这种情况下,字符串将连接到字符串。

q)"USD",/:string ccys
"USDAUD"
"USDCAD"
"USDNZD"

这是一个很好的例子,说明 'bracket free code' 的 kdb+ 意识形态有时会给您带来麻烦。

请务必牢记 KDB+ 纯粹从右到左求值。

在您的示例中,ccys 是一个符号列表,而“USD”已经是一个字符串。 通过在您的第一个代码片段中使用括号,您将符号列表转换为字符串列表,然后将“USD”连接到每个字符串中。 在您的第二个示例中,您首先将“USD”连接到每个符号(KDB+ 很高兴地允许这样做并创建一个新的混合列表数组)然后将结果串起来。 这将产生一个列表,其中每个元素都由一个字符串(以前是一个符号)组成,该字符串连接到 string"USD" - string-ing 的结果,一个字符串会将每个字符转换为它自己的 char 数组,因此奇怪的输出你正在看。

牢牢掌握语法会有所帮助。更准确地说,“从右到左求值”意味着:具有中缀语法的二元函数 f 具有长右作用域和短左作用域。没有parens,它的正确参数就是它正确的一切。它的左参数是它左边的第一个东西。因此,正如上面的答案所说,在 string ccys,\:"USD" 中,虽然 ,\: 的右参数是 "USD",但其左参数是 ccys,而不是 string ccys

想想 Each Left and Each Right as syntactic sugar. You can replace x f\:y with f[;y] each x and x f/:y with f[x;] each y. And variants of the same. So your two joins can be written as unary projections of Join,["USD";],[;"USD"] 可能会有所帮助。或者 "USD",,[;"USD"] 如果你愿意的话。

您可以将两个一元应用于一个货币代码:

q)("USD",;,[;"USD"])@\:string `AUD
"USDAUD"
"AUDUSD"

或者,Each,给所有的人。

q)raze`$("USD",;,[;"USD"])@'\:string ccys
`USDAUD`USDCAD`USDNZD`AUDUSD`CADUSD`NZDUSD

您可能时不时需要 cross-rates。

q)raze`${(x,;,[;x])@'\:string y}["GBP";ccys]
`GBPAUD`GBPCAD`GBPNZD`AUDGBP`CADGBP`NZDGBP