Hum, là ton erreur est toute simple. Tu as mis l'avoidstruts dans ton layouthook (d'ailleurs le layoutHook se trouve dans le main, pas directement dans le coeur du fichier; tu l'appelles par une variable, genre layoutHook = myLayoutHook), mais tu n'as rien dans ton layouthook. Déjà, c'est une erreur puisque tu ne peux pas ne pas avoir de layouts (tu as au minimum ceux par défaut, mais il faut les rappeler si tu spécifies un layoutHook) (en l'occurrence ça te le dit pas, puisque ta variable layoutHook n'est pas appelée, donc Haskell ne l'évalue pas par principe d'évaluation fainéante).
Ensuite, tu as ajouté un "$" à ton avoidStruts alors qu'il n'y a rien après. Pour info, le "$" en haskell permet d'inverser la précédence des fonctions: par défaut, les fonctions sont associées par la gauche en Haskell; si tu mets un "$", ce qui se trouve à droite est associé à ce qui se trouve à gauche _après_ avoir été évalué. En bref, ça permet de dissoudre les nids de parenthèses ( "f(a(b(c)))" devient "f a $ b $ c" ).
Donc, si tu le mets alors que tu n'as rien après, tu as une parse error, puisque tu dis à Haskell de passer en arguments à avoidStruts un "vide" évalué, ce qui n'est pas possible (un "simple vide", sans "$", n'aurait pas marché non plus car comme je te l'ai dit, avoidStruts prends en argument tes layouts donc sans layouts, ça marche pas).
Si tu veux utiliser avoidStruts, il faut donc que tu l'appelles en premier dans ta variable layoutHook avec "$" ET après, les layouts, que ce soit ceux par défaut que tu rappelles ou tes propres layouts configurés.