Der schwierigste Teil ist sicherlich das Zerlegen eines Problems in geeignete, kleinere Teilprobleme. Hier sollte man sich Zeit lassen und sorgfältig planen - eine spätere Änderung zieht oft erhebliche Mehrarbeit nach sich.
Die einzelnen Teilprobleme sollten weitgehend unabhängig voneinander sein. Oft ist es sogar günstig, die Teilprobleme allgemeiner zu formulieren.
makeIndex :: String -> [(Wort,[Int])]
makeIndex text = ( zusammenfassen -- (6)
. sortieren -- (5)
. entfernen -- (4)
. toWort -- (3)
. nummerieren -- (2)
. zeilenweise -- (1)
. satzZeichenEntfernen -- (0)
) text