2008-10-13 12 views

Antwort

15

Ein "Typ- und Effektsystem" beschreibt nicht nur die Arten von Werten in einem Programm, sondern auch die Änderungen dieser Werte. "Typestate" Überprüfung ist eine verwandte Idee.

Ein Beispiel könnte eine Art System, das Dateispuren Griff: anstatt eine Funktion close mit Rückgabetyp void würde aufzeichnen der Art System die Wirkung von close als Entsorgen der Dateiressource — jeden Versuchs zum Lesen mit oder schreiben in die Datei nach dem Aufruf close würde ein Typfehler werden.

Ich bin mir nicht bewusst, dass ein Typ und Effekt-System in einer Mainstream-Programmiersprache erscheint. Sie wurden verwendet, um statische Analysen zu definieren (zum Beispiel ist es ganz natürlich, eine Analyse für das richtige Sperren/Entsperren hinsichtlich der Effekte zu definieren). Daher werden Effektsysteme üblicherweise unter Verwendung von Inferenzschemata anstelle von konkreter Syntax definiert. Sie könnten eine Syntax suchen so etwas wie

File open(String name) [+File]; // open creates a new file handle 
void close(File f)  [-f] ; // close destroys f 

vorstellen Wenn Sie mehr erfahren möchten, können die folgenden Papiere interessant (fair Warnung: Die Papiere sind sehr theoretisch) sein.

6

(Dies ist keine verbindliche Antwort,. Nur versucht, mein Gedächtnis zu schleppen)

In gewissem Sinne jedes Mal, wenn ein ‚Zustand Monade‘ Code in einer Sprache, verwenden Sie den Typen System als ein potentielles Effektsystem. So "State" oder "IO" in Haskell erfassen diesen Begriff (IO erfasst auch eine ganze Reihe anderer Effekte). Ich erinnere mich vage daran, Artikel über verschiedene Sprachen gelesen zu haben, die fortgeschrittene Typsysteme verwenden, einschließlich Dinge wie "abhängige Typen", um die feinere Verwaltung von Effekten zu steuern, so dass zum Beispiel das Typ/Effekt-System Informationen darüber erfassen könnte, welche Speicherorte in einem verändert würden gegebener Datentyp Dies ist nützlich, da es Möglichkeiten bietet, zwei Funktionen zu machen, die sich gegenseitig ausschließende Bits des Zustands modifizieren können (Monaden pendeln typischerweise nicht und verschiedene Monaden sind nicht immer gut miteinander vereinbar), was sie oft macht schwer zu tippen (sprich: Zuweisen eines statischen Typs zu) 'vernünftige' Programme) ...

Eine Analogie zu einer sehr hand-welligen Ebene ist, wie Java Ausnahmen überprüft hat. Sie äußern im Typsystem zusätzliche Informationen über bestimmte Effekte (Sie können sich eine Ausnahme als einen "Effekt" für den Zweck der Analogie vorstellen), aber diese "Effekte" treten in der Regel über Ihr gesamtes Programm aus und sind nicht gut darin Übung (Sie enden mit einer Million "throws" -Klauseln oder greifen auf viele ungeprüfte Laufzeitausnahmetypen zurück).

Ich denke, dass in diesem Bereich eine Menge Forschung betrieben wird, sowohl für Forschungs-y- als auch Mainstream-Sprachen, da die Fähigkeit, Funktionen mit Effekt-Informationen zu versehen, die Fähigkeit des Compilers freisetzen kann, eine Reihe von Optimierungen durchzuführen Auswirkungen auf Nebenläufigkeit, und kann große Dinge für verschiedene Programmanalysen und Tooling tun. Ich persönlich habe keine großen Hoffnungen dafür, da ich glaube, dass viele kluge Leute schon lange daran arbeiten und es immer noch wenig zu zeigen gibt.

+1

Heiliger Kuhmann, sollte das Englisch sein? Versuche mit der Definition eines "Effekts" zu beginnen und gehe von dort aus. "Staatsmonade"? lol! Ich glaube nicht, dass Sie annehmen können, dass der Leser mit Haskell vertraut ist ... –

+0

Steven, ich bin kein Experte für monadische Programmierung, aber ich habe etwas Vertrautheit mit Haskell. –

+1

@ [marxidad]: das ist großartig, aber (a) du hast das nicht in der Frage gesagt, also war es eine Annahme und (b) andere Leute werden die Antworten lesen. –

4

können Sie einen Blick auf http://www.haskell.org/haskellwiki/DDC

Es ist eine Version von Haskell einen Effekt System zu implementieren.

+0

Leider hat haskell.org eine Umbesetzung vorgenommen und die Verbindung ist tot geworden! – fatuhoku

+0

@fatuhoku: Der Link wurde korrigiert. – chirlu