我们如何在 q 中使用迭代器将函数列表应用于每个参数列表?

How can we use iterators in q to apply a list of functions to each of a list of arguments?

在q/kdb中,我们可以将函数应用于多个参数,如下所示:

f each (1;2;3)

我们还可以将定义的参数应用于函数列表:

flist: (f1:{x+y+z},f2:{x+y-z},f3:{x-y+z});
flist  .\: 1 2 3

结合这两种方法的最有效方法是什么 - 将列表中的每个函数作为参数应用于列表中的每个值。例如,将 3 个一元函数 f1、f2 和 f3 应用于包含值 1、2 和 3 的列表(产生 9 次调用)。

非常感谢任何帮助!

您可以使用 eachboth (') 运算符:

q)f1:1+;f2:2+;f3:3+
q)(f1;f2;f3) @' 10 20 30
11 22 33

或者在 multi-argument 函数的情况下,

q)g1:+;g2:-;g3:*
q)(g1;g2;g3) .' (2 1;3 2;2 2)
3 1 4

并且如果要将每个函数应用于每个值,则需要先形成叉积:

q)(@/)each(f1;f2;f3) cross 10 20 30
11 21 31 12 22 32 13 23 33

您可以结合使用一元 apply-at @(因为您处理的是一元函数)和 each-left 和 each-right。例如:

q)({x+1};{neg x};{x*x}) @\:/: (1 2 3)
2 -1 1
3 -2 4
4 -3 9