2012-10-16 5 views
8

Ich versuche, einen Chat-Server mit Haskell zu entwickeln.Ist es in Ordnung, den Großteil des Codes mit IO-Monaden zu schreiben

Es gibt viele nützliche Tools wie TChan, TSkiplist, forkIO ... etc, aber es stellt sich heraus, dass die meisten meiner Code innerhalb der IO Monaden und unsafePerformIO geschrieben wird, was sehr ineffizient klingt.

Ist es in Ordnung, dies zu tun, oder ist Haskell nicht das richtige Werkzeug für diesen Zweck?

+1

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

Antwort

19

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.

+4

Gute Antwort. Ich würde mich nur viel stärker dagegen aussprechen, 'unsafe *' zu verwenden. Wenn Sie 'unsafe *' verwenden, verlieren Sie das, was Haskell erzwingt - um reine und unreine Berechnungen zu trennen. Und in Verbindung mit einer faulen Bewertung wird 'unsicher *' dein Leben unglücklich machen. –

+1

Guter Punkt. Ich habe den Ratschlag gegen unsichere aufgemotzt, aber ich habe den Punkt über faul + unsicher für Ihren guten Kommentar verlassen. – AndrewC

+1

Greate antwort danke! – user1748906

12

Immer wenn Sie bemerken, dass Sie eine lange Funktion haben, die sich in der IO-Monade befindet, lohnt es sich zu pausieren und einen Blick auf die Berechnungen zu werfen, die stattfinden. Meiner Erfahrung nach ist es (fast) immer der Fall, dass einige Nicht-IO-bezogene Sachen vor sich gehen, die keinen Zugriff auf die Eingangsausgabe benötigen und in reine Funktionen gekapselt werden können.

Dies hat den großen Vorteil, dass Sie gezwungen sind, richtige Abstraktionen und separate (reine) Algorithmen für die Eingabe/Ausgabe-Verarbeitung zu finden. Außerdem ist es viel einfacher, reine Funktionen zu überprüfen und zu testen. Natürlich werden Sie diese reinen Funktionen immer noch innerhalb von einigen IO a Funktion aufrufen (z. B. main), aber das ist völlig in Ordnung.

5

die meisten meiner Code wird innerhalb der IO Monaden geschrieben

ist das in Ordnung.

und unsafePerformIO

Das ist schlecht! Vermeiden Sie die Verwendung von unsafePerformIO wie die Pest; Es sollte nur von erfahrenen Haskellern unter sehr speziellen Umständen verwendet werden.

Ist es in Ordnung, dies zu tun, oder ist Haskell nicht das richtige Werkzeug für diesen Zweck?

Es ist OK, Code in der IO-Monade zu schreiben, aber nicht OK, unsafePerformIO zu verwenden. Erfahren Sie stattdessen, wie Sie E/A-Aktionen mit der Monad Schnittstelle (do Schreibweise) zusammenstellen. Erfahren Sie, welche Funktionstyp-Signaturen den Typ IO enthalten müssen.

+2

Vermeiden Sie unsafePerformIO! Wie starte ich eine Transaktion in io monads? – user1748906

+2

@ user1748906 Verwenden Sie "atomar". –

+3

@ user1748906 Wenn Sie die Typ-Signatur [STM a -> IO a] (http://www.haskell.org/hoogle/?hoogle=STM+a+-%3E+IO+a) hooglen, ist der erste Treffer " atomar ", wie Pthariens Flamme nahelegte. –

Verwandte Themen