Je voulais savoir, est-il fréquent et surtout utile de déclarer une instance de la classe MonadTrans à chaque fois que l'on crée une Monade ?
Par exemple, je réfléchis à comment réaliser un jeu de snake, j'ai un type Canvas déclaré ainsi :
Je fournis ensuite des opérations pour manipuler un canevas (ajouter un élément, bouger les éléments mobiles (le snake, par exemple), etc.). Ce sont des fonctions monadiques, donc leurs valeurs de retour seront toujours de type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 newtype Canvas i s a = Canvas (State (Array i s) a) deriving (Monad)Mes questions sont:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Canvas i s a
1) Pensez-vous qu'il soit au final utile que Canvas soit une Monade ? Je pourrais aussi bien le déclarer ainsi :
Et les fonctions pour manipuler un canevas prendraient simplement un argument de type "Canvas i s".
Code : Sélectionner tout - Visualiser dans une fenêtre à part newtype Canvas i s = Canvas (Array i s)
Pensez vous qu'utiliser le canevas comme une Monade représente un avantage réel ou bien n'est-ce plutôt ici qu'un "style de codage" pour éviter d'avoir à passer explicitement mon canevas en paramètre à chaque fonction qui le manipule ?
2) Si Canvas est bien une monade, est-il utile de déclarer une classe MonadCanvas (qu'instancierait le type Canvas) définissant les méthodes de manipulation d'un canevas, et de créer un type CanvasT qui instancierait à la fois MonadCanvas et MonadTrans ? (pour suivre le modèle des monades Reader, Writer, State, etc.)
En d'autres termes, est-il souhaitable à chaque fois que l'on crée une monade de créer le monad transformer associé ?
Je pose ces questions car si j'ai bien pigé l'utilité des monades de base de Haskell, je n'ai pas encore tout a fait saisi quand je peux ou non tirer profit des monades dans mes types à moi.
Partager