Les offres de programmation orientée objet :
- Encapsulation, à
- contrôler la mutation de l'état interne
- limiter le couplage à la représentation interne
- Sous-typage, permettant :
- substitution de types compatibles (polymorphisme)
- un moyen rudimentaire de partager l'implémentation entre les classes (héritage d'implémentation)
La programmation fonctionnelle, en Haskell ou même en Scala, peut permettre la substitution grâce à un mécanisme plus général de classes de types. L'état interne mutable est soit découragé, soit interdit. L'encapsulation de la représentation interne peut également être réalisée. Voir Haskell et la POO pour une bonne comparaison.
L'affirmation de Norman selon laquelle "l'ajout d'un nouveau type de chose dans un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonctions pour ajouter un nouveau cas" dépend de la manière dont le code fonctionnel a utilisé les classes de types. Si le filtrage sur un type de données abstrait particulier est répandu dans toute la base de code, vous souffrirez effectivement de ce problème, mais il s'agit peut-être d'une mauvaise conception au départ.
EDITED Suppression de la référence aux conversions implicites lors de la discussion sur les classes de types. En Scala, les classes de types sont codées avec des paramètres implicites, et non avec des conversions, bien que les conversions implicites soient un autre moyen de réaliser la substitution de types compatibles.