El artículo explora las operaciones de escaneo (scan) y reducción (fold) en lenguajes de arreglos como APL, centrándose en las funciones booleanas. Parte de la observación de que APL implementa optimizaciones nativas para combinaciones frecuentes como +/ (suma), gracias a que sus intérpretes reconocen patrones específicos y ejecutan bucles ajustados en código nativo, compitiendo en velocidad con lenguajes compilados.
El texto explica la diferencia entre escaneos y reducciones: mientras una reducción devuelve el valor final del acumulador tras iterar sobre una colección, un escaneo devuelve todos los valores intermedios. A partir de ahí, se plantea por qué los escaneos booleanos —operaciones como ≠\, =\, ∨\ o ∧\ aplicadas sobre vectores booleanos empaquetados en bits— son especialmente valiosos en APL: pueden procesar decenas de elementos por ciclo de CPU, frente a los 0,6 elementos por ciclo de una implementación naïve.
El núcleo del artículo es matemático: demuestra que muchas de las diez funciones booleanas binarias no triviales disponibles en APL pueden expresarse como composiciones de otras tres mediante reglas de equivalencia. Aplicando preprocesado, posprocesado o ambas transformaciones con la función de negación (~), es posible reducir la carga de implementación sin sacrificar rendimiento: en lugar de escribir código optimizado para cada primitiva, basta con optimizar unas pocas y derivar el resto. El texto acompaña cada relación con su equivalente en Haskell para facilitar la comprensión fuera del dialecto APL utilizado.
