2014-07-10 33 views
5

In Haskell ist eines der Dinge, die ich ziemlich schön finde, die Verwendung von Monaden als Abstraktion über wirkungsvolle Aktionen. Es schafft eine wirklich elegante Möglichkeit, imperativen Code auszudrücken, und erlaubt auch, dass mächtige Dinge mit Garantien für Korrektheit passieren.IO Monade in dynamisch typisierten Sprachen

Die IO-Monade scheint nicht spezifisch für stark typisierte Sprachen zu sein. Insbesondere scheint es mir nicht schwierig oder revolutionär zu sein, die IO-Monade in einer dynamisch typisierten Sprache zu implementieren. Es wäre dann nur notwendig, die Sprache so zu beschränken, dass alle IO-Aktionen lediglich Aktionen in der IO-Monade erzeugen.

Das gesagt, habe ich keine Sprachen gesehen (vielleicht bin ich einfach nicht hart genug suchen), die dynamisch typisiert sind, aber Nebenwirkungen mit Monaden isolieren. Gibt es einen Grund, warum das so ist? (Oder gibt es sie?)

Antwort

12

Sie zwei Fragen hier verschmelzt haben. Ich kann Ihnen dafür keine Vorwürfe machen, weil ein Großteil der Literatur zu Haskell die beiden Ideen miteinander verbindet. Aber die getippte IO ist der Ursprung der Magie in Haskells Ansatz. Die Tatsache, dass der IO-Typ eine Monade bildet, ist nicht wirklich wichtig. Es bedeutet nur, dass es Bibliotheksfunktionen mit anderen Typen teilen kann, anstatt sie selbst neu zu implementieren.

Die Monade Abstraktion funktioniert nicht wirklich gut in dynamisch typisierten Sprachen. Sicher, können sie Ihnen Analoga zu fmap und (>>=) geben, aber es gibt keine gute Möglichkeit für return in einer dynamisch typisierte Sprache zu arbeiten. Es ist in einer Typvariablen, die nur in ihrem Rückgabetyp angezeigt wird, polymorph. Ich bin mir keiner Sprache mit dynamischem Tippen bewusst, die dafür gerüstet ist, vernünftig damit umzugehen. Ich nehme an, es gibt wahrscheinlich Möglichkeiten, es zu hacken etwas wie ein freien Monade Bau und Tonnen von Selbstbeobachtung, aber ich bezweifle, dass es jemals so eine hilfreiche Abstraktion scheinen würde.

Der andere Teil, typisierte IO, könnte möglicherweise in eine dynamische Sprache integriert werden. Offensichtlich würde es zu Laufzeit-Tag-IO statt Typ-IO werden. Aber alles an der Sprache müsste aufgebaut werden, um es zu unterstützen. Der Einstiegspunkt für die Programmausführung müsste als ein E/A-Wert spezifiziert werden, anstatt das übliche Idiom, nur jede Zeile in der Datei auszuführen, wie es bei den meisten dynamischen Sprachen der Fall ist. Dann müssten Sie IO-Werte entweder mit Hilfe von Kombinatoren oder mit Syntax wie in Haskell erstellen. Und schließlich müssen Sie sich mit Nutzern abfinden, die behaupten, dass die Sprache zu schwer zu verwenden ist, weil sie nicht mit dem identisch ist, was sie gewohnt sind.

Wirklich, es ist der letzte, der ein Mörder ist.

+0

Okay, das macht sehr viel Sinn. Ein Laufzeit-getaggtes IO-System in einer dynamischen Sprache ist das, woran ich dachte (obwohl ich dachte, dass es die Monaden-Kombinatoren verwenden würde). Ich wusste nicht, dass es andere Typen von Kombinatoren für getippte IO-Aktionen gab. Hast du irgendwelche Beispiele? – Mystor

+3

Nun, Clean verwendet zum Beispiel ein System, das auf Eindeutigkeitstypen für IO basiert. Ich denke, Sie werden wahrscheinlich feststellen, dass jede Abstraktion, die für typisierte IO funktioniert, in etwa äquivalent zu monadischen Kombinatoren ist. Mein wirklicher Punkt war, dass diese Kombinatoren nicht der spezielle Teil des IO-Typs sind. Sie sind nur bequeme Plumbing-Operatoren und zufällig etwas, das in Haskells Typ-System polymorph definiert werden kann. – Carl