Betrachten Sie einige Monade-Transformatoren, sagen Sie
%Vor% Und einige Funktionen in J
:
Dann fand ich mich in J
context wieder. Ich kann schreiben
Nun möchte ich Queues in einem separaten Thread innerhalb von J
context
Was offensichtlich nicht funktioniert. Ich denke, es gibt eine Möglichkeit, ein so einfaches Problem zu lösen, ich kann es einfach nicht herausfinden.
Wie erwarten Sie, dass es funktioniert? Der separate Thread muss Zugriff auf einige Status und einige Fehler haben, da J
wraps StateT
und ErrorT
enthält. Wie soll der Thread darauf zugreifen? Wenn der Status im neuen Thread aktualisiert wird, sollte er auch im alten Thread geändert werden? Wenn der neue Thread eine Ausnahme auslöst, sollte der alte Thread anhalten?
Es kann nicht funktionieren, weil StateT
und ErrorT
reine Monade-Transformatoren sind, so dass die beschriebenen Verhaltensweisen nicht implementiert werden können. Sie müssen den Status explizit an den neuen Thread übergeben und dort eine neue Statusmonade ausführen, damit er funktioniert:
Ich bin mir nicht sicher, ob das das ist, was Sie brauchen, aber es hört sich an, als würden Sie nach einer Funktion suchen
%Vor%ist ähnlich wie forkIO, arbeitet aber stattdessen im J-Kontext. Im Allgemeinen sind alle Punkte von dflemstr gültig. Aufgrund der Reinheit von Haskell gibt es viele ungelöste Fragen zur Staatsverwaltung.
Wenn Sie jedoch bereit sind, Ihre Logik ein wenig zu restrukturieren, ist eine Option, die für Sie funktionieren kann (wenn Sie nach einem separaten Thread mit Zugriff auf den ursprünglichen Zustand suchen, wenn Sie die Verzweigung ausgaben) die angehobene Basis pakcage, was von Monad-Kontrolle abhängt. Es wird Ihnen im Wesentlichen die obige forkJ-Funktion geben, solange Sie IO am unteren Ende Ihres Transformatorstapels haben.
Wenn nun die 2 Threads in statusbehafteter Weise kommunizieren sollen, so dass Fehler, die in dem Kind ausgelöst werden, als Teil der ErrorT-Maschinerie an den Hauptthread weitergegeben werden, ist dies einfach nicht möglich (wie dflemstr erklärt wurde). Sie können jedoch einen Kommunikationskanal zwischen den 2 Threads einrichten, indem Sie ein Konstrukt aus der Modulfamilie Control.Concurrent verwenden. Eines der folgenden Module könnte das haben, was Sie brauchen:
%Vor%Tags und Links haskell monad-transformers