Jeff, creo que tienes la intuición correcta: depende.
Las jerarquías de clases orientadas a objetos con envío de métodos virtuales son buenas cuando tiene un conjunto relativamente fijo de métodos que deben implementarse, pero muchas subclases potenciales que pueden heredar de la raíz de la jerarquía e implementar esos métodos. En dicha configuración, es relativamente fácil agregar nuevas subclases (solo implementar todos los métodos), pero es relativamente difícil agregar nuevos métodos (debe modificar todas las subclases para asegurarse de que implementen correctamente el nuevo método).
Los tipos de datos con funcionalidad basada en la coincidencia de patrones son buenos cuando tiene un conjunto relativamente fijo de clases que pertenecen a un tipo de datos, pero muchas funciones potenciales que operan en ese tipo de datos. En dicha configuración, es relativamente fácil agregar nuevas funcionalidades para un tipo de datos (solo coincidencia de patrones en todas sus clases), pero es relativamente difícil agregar nuevas clases que sean parte del tipo de datos (debe modificar todas las funciones que coinciden) en el tipo de datos para asegurarse de que sean compatibles con la nueva clase).
El ejemplo canónico para el enfoque OO es la programación de GUI. Los elementos de GUI deben admitir muy poca funcionalidad (dibujarse en la pantalla es el mínimo indispensable), pero se agregan nuevos elementos de GUI todo el tiempo (botones, tablas, gráficos, controles deslizantes, etc.). El ejemplo canónico para el enfoque de coincidencia de patrones es un compilador. Los lenguajes de programación generalmente tienen una sintaxis relativamente fija, por lo que los elementos del árbol de sintaxis cambian raramente (si es que lo hacen), pero se agregan constantemente nuevas operaciones en árboles de sintaxis (optimizaciones más rápidas, análisis de tipo más exhaustivos, etc.).
Afortunadamente, Scala le permite combinar ambos enfoques. Las clases de casos pueden combinarse con patrones y admitir el envío de métodos virtuales. Las clases regulares admiten el envío de métodos virtuales y se pueden combinar con el patrón definiendo un extractor en el objeto complementario correspondiente. Depende del programador decidir cuándo cada enfoque es apropiado, pero creo que ambos son útiles.
El enlace de Beust está roto, aparentemente se debe a un cambio de esquema de URL. Traté de ver si podía averiguar cuál era la publicación, pero no estoy seguro. Proporcione un enlace corregido o más información para continuar (¿cuál era el título de la publicación?). –