[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

2 ответа

Решение

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

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

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

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

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
Другие вопросы по тегам