[KDB + / Q]:按顺序应用函数列表(管道)

时间:2017-08-03 16:59:32

标签: currying kdb q-lang

在kdb + / q中,如何通过顺序的函数列表来管道数据,以便上一步的输出是下一步的输入?

例如:

q)t:([]sym:`a`c`b;val:1 3 2)
q)`sym xkey `sym xasc t                / how to achieve the same result as this?

我认为over/的某些变体可以起作用:

   ?? over (xasc;xkey)

加分:如何以t从右侧传递出来的方式实现同​​样的目标(本着左右的精神读取q语法)?

(xasc;xkey) ?? t

2 个答案:

答案 0 :(得分:5)

  

如何通过顺序的函数列表来管道数据,以便上一步的输出是下一步的输入?

您可以使用鲜为人知的composition operator。例如:

q)f:('[;])over(2+;3*;neg)
q)f 1 # 2+3*neg 1
-1

如果您想使用正确语法的左侧,则必须定义自己的动词:

q).q.bonus:{(('[;])over x)y}
q)(2+;3*;neg)bonus 1
-1

答案 1 :(得分:2)

使用左边的lambda和over副词(递归的形式) 此外,apply(。)形式的apply用于将函数应用于表和列:

  {.[y;(z;x)]}/[t;(xasc;xkey);`sym]
  sym| val
  ---| --- 
  a  | 1
  b  | 2
  c  | 3