[KDB + / Q]: последовательно применять список функций к данным (вертикальная черта)

Как в 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

person Daniel Krizian    schedule 03.08.2017    source источник


Ответы (2)


Используйте лямбду слева, а также наречие (форма рекурсии). Также форма с точкой (.) Применяется для применения функции к таблице и столбцу:

  {.[y;(z;x)]}/[t;(xasc;xkey);`sym]
  sym| val
  ---| --- 
  a  | 1
  b  | 2
  c  | 3
person jomahony    schedule 03.08.2017
comment
Превосходно! Я попытался обернуть голову .[;(;)] и тут понял, что это эквивалентно (короче) {y .(z;x)}/[t;(xasc;xkey);`sym] или даже короче {y[z;x]}/[t;(xasc;xkey);`sym] - person Daniel Krizian; 04.08.2017

как передать данные через последовательный список функций, чтобы результат предыдущего шага был входом для следующего шага?

Вы можете использовать малоизвестный оператор композиции. Например:

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
person Alexander Belopolsky    schedule 04.08.2017
comment
умопомрачительно, спасибо, что раскрыли этого оператора композиции! Очень полезный. Кстати, чтобы обработать список с самого начала (обычное понятие начала списка - крайнее левое, т.е. neg в данном случае): ('[;])over reverse (neg;3*;2+) - сначала negate, затем умножить на 3, затем добавить 2, равно -1 - person Daniel Krizian; 04.08.2017