← На главную

K-программисты с REPL сжимают матричное умножение в однострочник

22.05.2026 17:42 · hackernews

Большинство K-программистов работают прямо в REPL — так удобно итеративно улучшать код. ngn/k с rlfe поддерживает историю стрелками, этого хватает для серьёзных проектов. Функции тестируют в REPL, потом переносят в скрипт. Скрипт выполняется построчно, как ввод в REPL; результат печатается, если строка не заканчивается точкой с запятой. Многострочные определения упрощают чтение. Чтобы загрузить скрипт в REPL, пишут \l file.k, и файл исполняется. Можно загружать повторно, перезаписывая данные. Команда \ выводит список полезных команд.

Программирование на K (и вообще на языках массивов) — это постоянное упрощение шаблонов. Громоздкая конструкция почти всегда сжимается до короткой, декларативной и читаемой. Аарон Хсу подробно разбирает это в докладе «Patterns and Anti-patterns in APL: Escaping the Beginner's Plateau» на Dyalog '17.

Частая проблема — перевести известный алгоритм на K, например, матричное умножение из Wikipedia. Императивная версия на три вложенных цикла с кучей глобальных переменных — худший возможный код на K. Проблемы: глобалы, вложенные циклы, модификация. Разберём упрощение на примере.

Начинаем с самого внутреннего цикла, где считали сумму. Заменяем его на fold (/) — сразу убираем одну глобальную переменную. Затем избавляемся от C: each возвращает массив, так что результат вложенных циклов можно просто вернуть. После этого остаются три цикла без модификаций — гораздо легче. Убираем k: он просто сопоставлял строки A и столбцы B — вместо этого напрямую умножаем A[i] на столбцы B. Исчезает один цикл и переменная m.

Дальше убираем j: транспонируем B и применяем eachright. Затем избавляемся от i через eachleft. В итоге остаётся однострочник без единой глобальной переменной. Транспонирование дорогое, поэтому финальный вариант делает то же самое неявно, сопоставляя строки B со всей матрицей A. Полученную функцию легко превратить в tacit-форму, следуя правилам из третьей главы. Выходит компактное и элегантное матричное умножение, которым можно гордиться.

Процесс кажется многошаговым, но с практикой упрощение кода на K становится интуитивным. Матричное умножение — простой пример, хорошо ложащийся на массивы. В следующих главах разберут алгоритмы, которые дружат с K не так хорошо.

Читать оригинал →