Je comprends votre situation, mais vous verrez que d'apprendre la programmation fonctionnelle, vous aurez besoin d'ajuster votre point de vue à la documentation que vous trouverez, au lieu de l'inverse. Heureusement, en Scala, vous avez la possibilité de devenir un programmeur fonctionnel progressivement.
Pour répondre à vos questions et expliquer le point de vue de la différence, j'ai besoin de distinguer entre les "classes de type" (monoids, foncteurs, flèches), mathématiquement appelle les "structures", et générique des opérations ou des algorithmes (catamorphisms ou des plis, anamorphisms ou se déroule, etc.). Ces deux interagissent souvent, depuis de nombreux génériques opérations sont définies pour des catégories spécifiques de types de données.
Vous recherchez normative des réponses similaires aux modèles de conception: lorsque ce concept s'applique? La vérité est que vous avez sûrement vu les réponses normatives, et ils sont tout simplement les définitions des différents concepts. Le problème (pour vous) c'est que ces réponses sont intrinsèquement différents des modèles de conception, mais il l'est pour de bonnes raisons.
D'une part, des algorithmes génériques ne sont pas des modèles de conception, qui suggèrent une structure pour le code que vous écrivez; ils sont des abstractions défini dans la langue que vous pouvez appliquer directement. Ils sont des descriptions générales pour le commun des algorithmes qui vous mettent déjà en œuvre aujourd'hui, mais à la main. Par exemple, si vous êtes le calcul de l'élément maximum d'une liste par l'analyse, vous êtes coder en dur une fois; lorsque vous somme des éléments, vous faites la même chose, et ainsi de suite. Lorsque vous reconnaissez que, vous pouvez déclarer l'essence de l'opération effectuée par un appel à la appropriée de la fonction fold. De cette façon, vous économisez de code et de bugs (pas de possibilité pour tout-en-un d'erreurs), et que vous enregistrez le lecteur l'effort de lire tout le code nécessaire.
D'autre part, les structures ne concernent pas l'objectif que vous avez à l'esprit, mais les propriétés des entités vous êtes à la modélisation. Ils sont plus utiles pour les bas-logiciel de construction, plutôt que de haut en bas: lors de la définition de vos données, vous pouvez déclarer que c'est un par exemple un monoïde. Plus tard, lors du traitement de vos données, vous avez la possibilité d'utiliser des opérations sur, par exemple, monoids pour mettre en œuvre votre traitement. Dans certains cas, il est utile de s'efforcer d'exprimer votre algorithme en termes de prédéfinis. Par exemple, très souvent, si vous avez besoin de réduire un arbre à une valeur unique, un pli peut faire la plupart ou la totalité de ce que vous avez besoin. Bien sûr, vous pouvez également déclarer votre type de données est un monoïde lorsque vous avez besoin d'un algorithme générique sur monoids; mais le plus tôt vous remarquez que, le plus tôt vous pouvez commencer à la réutilisation des algorithmes génériques pour monoids.
Dernier conseil, c'est que probablement la plupart de la documentation que vous trouverez sur ces concepts préoccupations Haskell, parce que cette langue a été autour pendant beaucoup plus de temps et les soutient dans un assez élégant. Tout à fait recommandé, voici Apprendre que vous avez un Haskell pour le Grand Bien, un Haskell cours pour les débutants, où entre autres les chapitres 11 à 14 focus sur certaines classes de type, et Typeclassopedia (qui contient des liens vers divers articles avec des exemples précis). EDIT: Enfin, un exemple d'applications de Monoids, prises de Typeclassopedia, c'est ici: http://apfelmus.nfshost.com/articles/monoid-fingertree.html. Je ne dis pas qu'il y a peu de documentation pour la Scala, juste qu'il y a de plus en Haskell, et Haskell est où l'application de ces concepts à la programmation était né.