#kdb
#kdb
Вопрос:
-
Что такое (!). called в kdb?
-
и допустимы ли приведенные ниже варианты использования (!). для преобразования списка в словарь или есть лучшие способы и другие варианты использования (!). ?
Пример:q)(!). (`A`B;(`C`D`E;`F`G`H)); q).[(!);flip (`A`B;`C`D;`E`F)]
Я не могу найти никакой документации по вариантам использования в (!). в руководствах kdb. Пожалуйста, поделитесь любой информацией о (!). и его использовании?
Ответ №1:
Это версия apply amp; да, ваш вариант использования допустим. Причина, по которой оператор заключен в круглые скобки, заключается в том, что он сам является диадическим инфиксным оператором, как и точка apply (.)
Если вы попытаетесь применить его как есть, ваше выражение будет похоже на so, что Q не нравится
// infixOp infixOp operand
q) . 4 5
'
[0] . 4 5
^
Обертывание оператора в круглых скобках эффективно преобразует его, так что выражение теперь становится
// operand infixOp operand
q)( ). 4 5
9
Если вы определяете функцию, которая не может использоваться с инфиксом, тогда нет необходимости ее переносить
q)f:
q)4 f 5
'type
[0] 4 f 5
^
q)f . 4 5
9
При использовании apply с обозначением в скобках, как в вашем примере, нет необходимости переносить функцию
q).[ ;4 5]
9
https://code.kx.com/q/ref/apply/#apply-index
https://code.kx.com/q/basics/syntax/#parentheses-around-a-function-with-infix-syntax
Джейсон
Ответ №2:
Что касается вариантов использования, я нахожу это очень полезным при определении словарей / таблиц как конфигураций, особенно когда словари слишком широкие (по горизонтали) для экрана или когда более полезно видеть поля / сопоставления по вертикали в виде пар. С точки зрения кода / скрипта это так.
Например:
mapping:(!) . flip(
(`one; 1);
(`two; 2);
(`three; 3));
намного легче читать при сканировании через q-скрипт, чем
mapping2:`one`two`three!1 2 3
когда последнее становится очень широким.
Конечно, это не имеет никакого значения для фактического словаря, потому что, как указал Джейсон, это одно и то же.