Jeff, ich denke du hast die richtige Intuition: es kommt darauf an.
Objektorientierte Klassenhierarchien mit virtuellem Methodenversand sind gut, wenn Sie relativ viele Methoden implementieren müssen, aber viele potenzielle Unterklassen, die vom Stamm der Hierarchie erben und diese Methoden implementieren können. In einem solchen Setup ist es relativ einfach, neue Unterklassen hinzuzufügen (implementieren Sie einfach alle Methoden), aber es ist relativ schwierig, neue Methoden hinzuzufügen (Sie müssen alle Unterklassen ändern, um sicherzustellen, dass sie die neue Methode korrekt implementieren).
Datentypen mit Funktionen, die auf Mustervergleich basieren, sind gut, wenn Sie relativ viele Klassen haben, die zu einem Datentyp gehören, aber viele potenzielle Funktionen, die mit diesem Datentyp arbeiten. In solch einem Setup ist es relativ einfach, neue Funktionalität für einen Datentyp hinzuzufügen (nur Mustervergleich für alle Klassen), aber relativ schwierig, neue Klassen hinzuzufügen, die Teil des Datentyps sind (Sie müssen alle Funktionen anpassen, die übereinstimmen auf dem Datentyp, um sicherzustellen, dass sie die neue Klasse ordnungsgemäß unterstützen).
Das kanonische Beispiel für den OO-Ansatz ist GUI-Programmierung. GUI-Elemente müssen sehr wenig Funktionalität unterstützen (das Zeichnen auf dem Bildschirm ist das Nötigste), aber es werden ständig neue GUI-Elemente hinzugefügt (Schaltflächen, Tabellen, Diagramme, Schieberegler usw.). Das kanonische Beispiel für den Mustervergleich ist ein Compiler. Programmiersprachen haben normalerweise eine relativ feste Syntax, so dass die Elemente des Syntaxbaums selten (wenn überhaupt) geändert werden, aber neue Operationen auf Syntaxbäumen werden ständig hinzugefügt (schnellere Optimierungen, gründlichere Typanalyse, usw.).
Glücklicherweise können Sie mit Scala beide Ansätze kombinieren. Fallklassen können sowohl patterned sein als auch den Versand virtueller Methoden unterstützen. Reguläre Klassen unterstützen den Versand virtueller Methoden und können Muster zugeordnet werden, indem ein Extraktor im entsprechenden Begleitobjekt definiert wird. Es liegt am Programmierer zu entscheiden, wann jeder Ansatz angemessen ist, aber ich denke beide sind nützlich.
Der Beust-Link ist defekt, anscheinend zu einer Änderung des URL-Schemas. Ich habe versucht zu sehen, ob ich herausfinden könnte, welcher Posten gemeint ist, aber ich bin mir nicht sicher. Bitte geben Sie einen korrigierten Link oder weitere Informationen an (wie lautet der Titel des Beitrags?). –