函数中的 kdb+/q 索引

kdb+/q indexing in functions

我是 kdb+/q 语言的新手,正在尝试一些基本的在线练习。

我正在尝试创建一个接受列表的函数,returns 列表中的第二项加倍。

L:{[x;y] y:[1]; y*2; x}

我的尝试包括将函数分配给 L,概述我的参数 xy,然后我的逻辑是通过索引到value y 并将此值乘以 2。我使用 x 因为我想将列表分配给 x 然后我在函数末尾输出 x 。每次我测试它输入一个列表 L 10 20 30 40 50 时,我都没有看到第二项有任何变化。我需要一些帮助来判断我的语法是否不正确,或者我的逻辑是否正确,或者两者兼而有之。我目前使用 Q for Mortals 作为参考。如果是我的语法错误。 q 中函数的正确语法是什么?

有几种方法可以做到这一点。函数中只需要一个参数就可以获取输入列表。

  1. 更新列表中的值和return列表。

    q) f:{x[1]*:2;x}
    q) f 1 2 3
    q) 1 4 3 // output
    

函数 'f' 有一个参数 'x' 将分配给输入列表。

  1. 使用functional amend ('@')

    q) f:{@[x;1;*;2]}
    q) f 1 2 3
    q) 1 4 3 //output
    

在您的示例中,您将 y 设置为 1 并返回 x 未修改。

您的方法的正确语法是以下之一:

{[x]x[1]:2*x[1];x}
{[x]x[1]*:2;x}

在这种情况下,只需要一个参数。第一个示例没有保存到变量,而是直接更新了第二个元素。第二个例子更简洁,但表达方式大致相同。

另一种可以说更干净的方法是:

{[x]@[x;1;2*]}

将函数 2* 应用于第二个元素。