2014-02-17 3 views
8

Ich habe mir die algo.monads und fluokitten Dokumentation angesehen. Ich habe auch Monad Blog-Einträge von Jim Duey, Konrad Hinsen und Leonardo Borges gelesen.Ist es möglich, die IO Monade von Haskell in Clojure zu tun?

Die nächstgelegene ich finden kann, ist Konrad Hinsen's library Monadic IO streams - aber das scheint nicht zu (in Ermangelung einer besseren Phrasierung) ‚die Monade Schnittstelle zu implementieren‘

Dies ist am Beispiel ST in Haskell

oneST :: ST s Int -- note that this works correctly for any s 
oneST = do var <- newSTRef 0 
      modifySTRef var (+1) 
      readSTRef var 

one :: Int 
one = runST oneST 

Meine Frage ist: Ist es möglich, die IO Monad from Haskell in Clojure zu tun? Können Sie ein Beispiel geben?

+0

Ist Clojure keine dynamisch typisierte Sprache? Was wäre dann der Vorteil von Monaden wie IO oder ST? Ausnahmen bei illegalen Operationen werfen?Dies könnte besser sein, als später im Programmablauf mit den Auswirkungen illegaler Operationen fertig zu werden. – ziggystar

+3

Welche Besonderheiten von Haskell 'IO' möchten Sie in Clojure wiederverwenden? –

+5

Ja, das ist möglich. – augustss

Antwort

14

Es gibt einige Möglichkeiten, diese Frage zu beantworten.

Ja

  • Trivial: Denken Sie an IO als Monade Transformator, der die spezielle Erlaubnis des Arbeitens mit Nebenwirkungen gewährt. Dann ist jede Monade in Clojure eine IO-Monade, da das Ausführen von Nebenwirkungen keine privilegierte Operation in Clojure ist.

  • Fatuously: Clojure ist Turing-vollständig, so dass Sie alle von Haskell, einschließlich der IO-Monade in Clojure implementieren können. Haskell ist Turing-vollständig, also könntest du Clojure in Haskell implementieren und die IO-Monade aufdecken.

Keine

  • Philosophisch: Das Wesen der IO Monade, Reinheit zu bewahren, während sie mit dem Typ-System integriert ist, unvereinbar mit Verunreinigung des Clojure und dynamischer Typisierung. Jeder Versuch, in der IO-Monade zu schüren, würde entweder mit Clojures Philosophie unvereinbar sein oder den wesentlichen Punkt einer IO-Monade nicht erfassen.

Vielleicht

  • Partiell: Die monadische-io-streams Bibliothek in der Frage verbunden ist für die Verwendung mit der algo.monads Bibliothek bestimmt sind, oder sein Vorgänger. Die monadische Schnittstelle ist die Zustands-Monade. Monadic-io-streams bietet einige inhaftierte IO monadische Funktionen, um damit zu arbeiten. Das hindert Sie nicht daran, irgendwelche anderen Funktionen mit Nebeneffekten zu benutzen, und ohne ein Typsystem, das IO integriert, gibt es keinen systematischen Weg zu sagen, welches was ist. Dies ist nicht die IO Monade; es macht nur ein paar Dinge ähnlich wie die IO-Monade. Dies ist interessant, aber von zweifelhafter Nützlichkeit.

  • Eines Tages: Es gibt ein Interesse an Typed Clojure. Wenn dem Typsystem Nebenwirkungen hinzugefügt werden, dann kann es wünschenswert werden, sie für bestimmte Zwecke in einer strukturierten Weise zu isolieren und einen Grund für die Existenz von etwas wie einer IO-Monade in typisierter Clojure zu geben.

Verwandte Themen