Donc quelque chose qui a tendance à être plutôt global comme un journal ou une configuration, vous suggéreriez de le mettre dans le IO ? En examinant un ensemble d'exemples (certes d'exemples (certes très limités), j'en viens à penser que le code Haskell a tendance à être soit pur (c'est-à-dire pas du tout monadique) soit dans la monade IO. Ou s'agit-il d'une idée fausse ?
Je pense que c'est une idée fausse, seule la monade IO n'est pas pure. Les monades comme Write/T/Reader/T/State/T/ST sont toujours purement fonctionnelles. Vous pouvez écrire une fonction pure qui utilise n'importe laquelle de ces monades en interne, comme dans cet exemple complètement inutile :
foo :: Int -> Int
foo seed = flip execState seed $ do
modify $ (+) 3
modify $ (+) 4
modify $ (-) 2
Tout ce que cela fait, c'est enfiler/plomber l'état implicitement, ce que vous feriez vous-même à la main explicitement, la do-notation ici vous donne juste un peu de sucre syntaxique pour que cela semble impératif. Vous ne pouvez pas faire d'actions IO ici, vous ne pouvez pas appeler de fonctions étrangères. La monade ST vous permet d'avoir de vraies références mutables dans une portée locale tout en ayant une interface de fonction pure et, vous ne pouvez pas faire d'actions d'E/S ici, c'est toujours purement fonctionnel.
Vous ne pouvez pas éviter certaines actions de l'OI, mais vous ne voulez pas vous rabattre sur l'OI pour tout, car c'est là que tout peut arriver, des missiles peuvent être lancés, vous n'avez aucun contrôle. Haskell a des abstractions pour contrôler les calculs efficaces à différents degrés de sécurité/pureté, la monade IO devrait être le dernier recours (mais vous ne pouvez pas l'éviter complètement).
Dans votre exemple, je pense que vous devriez vous en tenir à l'utilisation de transformateurs de monade ou d'une monade personnalisée qui fait la même chose que la composition avec des transformateurs. Je n'ai jamais écrit de monade personnalisée (pour l'instant) mais j'ai beaucoup utilisé les transformateurs de monade (dans mon propre code, pas au travail), ne vous inquiétez pas trop à leur sujet, utilisez-les et ce n'est pas aussi mauvais que vous le pensez.
Avez-vous vu le chapitre de Haskell dans le monde réel qui utilise des transformateurs de monades ?