Als allgemeine Regel versuchen Sie zuerst schreiben Sie Code als nur reine Funktionen ohne sich Sorgen zu machen, wo die Daten herkommen - nehmen Sie einfach an, es ist da.
Jetzt wickeln Sie diese pure Funktionalität in IO, um Ihre reinen Funktionsdaten zu füttern und die Ergebnisse irgendwo zu platzieren. Es ist OK, dass es eine Lot davon in einer Chat-Anwendung geht! Die IO Monade ist überhaupt nicht ineffizient, es ist nur, dass wir es vorziehen, so viel Code wie möglich zu behalten, da das gute Design ist - halten Sie die Daten knirschen getrennt von der IO. Eine Chat-Anwendung berechnet nicht viel mit den Daten, die sie bekommt, also ist es in Ordnung, eine Menge IO-Code zu haben.
Ich denke es ist definitiv besser, in der IO-Monade zu bleiben, als unsafePerformIO zu verwenden, weil unsafePerformIO sein Ergebnis als reine Daten darstellt. Ich könnte versucht, um es zu verwenden, um Konstanten aus einer Konfigurationsdatei zu erhalten, aber ich habe es nie tatsächlich getan, und es gibt keinen Sinn, wenn Sie sowieso schwer in der IO-Monade sind. Es gibt einen Grund, warum es unsicher heißt! Petr Pudlák hat guten Rat in dem Kommentar unten.
Ich habe Haskells Monaden als best imperative programming language in der Welt gehört. Ich könnte Haare über diese Beschreibung spalten, aber ich stimme dem Gefühl zu, und ja, Stick mit Haskell. Haskell ist gut in der Programmierung, für die Sie es verwenden.
Werfen Sie einen Blick auf [Hulk] (http://chrisdone.com/posts/2011-01-30-hulk-haskell-ircserver.html) - ein Start ein Schreiben eines IRC-Servers in Haskell. – ErikR