I see many ways to improve this code. And to be sure, next time I'll be closer to an ideal answer the first time out of the chute. So, practice and planning will minimize the risk. But that only get's you so far, and a requirement change might require you refactor your code anyway. As you say, it minimizes, does not eliminate the risk.
Other language have powerful refactoring tools, so I was wondering if there were some for haskell as well. Maybe there is a different design pattern I should be using here that would've have avoided this problem. If so, I'd love to know!
-Ryan