2015-08-13 15 views
8

In Haskell haben wir die IO Monade mit Nebenwirkungen zu behandeln, obwohl es nicht in der Lage ist, Nebenwirkungen zu verfolgen, Sie nicht wirklich wissen, welche Art von Nebeneffekt wirklich ist Hergang:Monad für die Verfolgung von Nebenwirkungen

main :: IO() 

In PURESCRIPT haben wir die Eff Monade, wo Sie in der Lage sind, zu wissen, welche Art von Nebenwirkungen happen nach der Art Signatur:

main :: forall e. Eff (fs :: FS, trace :: Trace, process :: Process | e) Unit 

Hier wird deutlich, dass die main Funktion verwendet die filesys tem, um Nachrichten an die Konsole zu verfolgen und ist in der Lage, den aktuellen Prozess zu handhaben, wo wir ein spezifisches Modul Control.Monad.Eff für den Umgang mit Nebenwirkungen und Submodule wie Control.Monad.Eff.Random und Control.Monad.Eff.Console haben.

mit gutem Beispiel mit folgendem:

module RandomExample where 

import Prelude 

import Control.Monad.Eff 
import Control.Monad.Eff.Random (random) 
import Control.Monad.Eff.Console (print) 

printRandom :: forall e. Eff (console :: CONSOLE, random :: RANDOM | e) Unit 
printRandom = do 
    n <- random 
    print n 

Dieses so viel mehr spezifisch ist als die Verwendung von nur „Hey, hier kommt ein Nebeneffekt, das ist es, nicht mehr, dass Sie wissen müssen!“. Ich habe durch das Web geschaut und ich habe keine Monade gesehen, die vollständig genug ist, um Nebenwirkungen zu verfolgen.

Gibt es eine bestimmte Monade in Haskell, wie Eff, für die Verfolgung von Nebenwirkungen?

Vielen Dank im Voraus.

+1

Nun, es gibt alle Arten von Nebenwirkungen, also was willst du? - Einige von ihnen haben ihre eigenen Monaden (State, ...) und viele Bibliotheken stellen einige mehr vor (Jessod, ...) - aber nein, ich denke du kannst sie nicht zusammenbauen wie in PureScript - normalerweise gibt es Transformatoren und die Monade- Stack-Konzept, dies zu tun – Carsten

+0

Ein kleiner Nitpick: 'IO' hat * Effekte *, keine Nebenwirkungen. Ein Nebeneffekt wäre etwas Böses wie eine Berechnung, die vorgibt, rein zu sein, aber IO über "unsafePerformIO". – Cactus

Antwort

4

Es gibt einige Bibliotheken, die ähnliche Effektsysteme für Haskell definieren.

Ich habe einige mit extensible-effects, gearbeitet und fand es ganz einfach IO beschränkt hinzuzufügen, zB STDIO, FileIO, Effekte. Der Mangel an Compiler-Unterstützung ist etwas weniger gut zu verwenden.

Wenn Sie es ausprobieren wollen Sie Inspiration in bestehenden Effekten für die extensible-effects Rahmen finden: http://hackage.haskell.org/packages/#cat:Effect

Es scheint zu sein, eine Version von extensible-effects, die nicht Typeable nicht verwendet Effekte verfolgen: http://hackage.haskell.org/package/effin. Das sollte es schöner machen, neue Effekte zu schreiben.

Verwandte Themen