Bah l'avantage c'est qu'il y a des tonnes de modules ( http://xmonad.org/xmonad-docs/xmonad-contrib/index.html ), donc si tu veux quelque chose y'a de très grandes chances pour qu'il y ait déjà un module tout fait à importer, donc pas de code à faire toi-même.
Par contre parfois ça suffit pas, et il faudra te débrouiller.
Par exemple, il existe un module pour circuler entre les workspaces (vues); ce module contient diverses fonctions, comme "passer au suivant/précédent", "envoyer vers tel workspace", ... Moi, étant donné que j'utilise le module scratchpad, j'ai besoin de me déplacer dans mes workspaces en ignorant un workspace, "NSP", qui est utilisé par le module scratchpad pour stocker lesdits scratchpads. Je ne veux pas, quand je cycle, m'y retrouver, il faut donc le sauter. Aucune fonction de ce module ne fait ça, par contre il y a une fonction WSIs, qui permet d'interpréter n'importe quelle autre fonction. Au final, j'ai du faire ça (avec l'aide de l'IRC, évidemment):
moveTo Next (WSIs (return (\ws -> W.tag ws /= "NSP")))
ce qui permet de se déplacer au workspace suivant, à condition que le prédicat suivant soit validé: le workspace visé (\ws) n'a pas comme nom de tag (W.tag) "NSP" ( /= "NSP"). C'est un exemple de ce que tu peux être amené à trouver. J'aurais pu me débrouiller sur la comparaison des tags, mais j'aurais été incapable de trouver tout seul qu'il faut finir par wrapper la fonction avec return.
Et comme tu vois c'est pas forcément très clair comme langage. Donc ça dépend de ce que tu veux faire, si t'as pas des exigences trop compliquées tu pourras te débrouiller sans un snippet de haskell ou en prenant sur d'autres configs, sinon va falloir faire chauffer l'IRC.