Was ist ein guter Weg, um eine Leitung in ExceptT
zu wickeln? Der Ansatz sollte die Verarbeitung bei einem Fehler stoppen und die Fehlermeldung extrahieren. Hier ist ein Spielzeug-Code ohne Fehlerbehandlung - es ist nur still hält:Einwickelschlauch in ExceptT
import Data.Conduit as C
import Data.ByteString as BS
import Control.Monad
import Control.Monad.IO.Class
import Data.Text as T
-- just a dummy processing to simulate errors
process :: BS.ByteString -> Either (Int,T.Text) BS.ByteString
process inp = if (BS.null inp) then Left $ (1,"Empty input") else Right inp
-- silent processing - stops on error but doesn't tell us what it is
sink :: MonadIO m => Consumer BS.ByteString m()
sink = do
bs <- await
case bs of
Just val -> do
let msg = process val
case msg of
Left _ -> return()
Right x -> (liftIO $ return x) >> sink
Nothing -> return()
Wie könnten wir die Art Signatur von sink
so etwas wie unten ändern?
sink :: MonadIO m => ExceptT e m (Consumer BS.ByteString m())
Bei Left
, wird es schön, aus der Pipeline zu brechen, und gibt die Fehlermeldung nach oben. Ich lese dies blog post, aber habe es noch nicht gut genug verstanden, um es auf Conduit (die auch komplizierte Signatur hat) anzuwenden. Ich möchte den vorgeschlagenen Ansatz here auf Conduit anwenden - es scheint EitherT
vorgeschlagen in der Ansatz wurde nun von ExceptT
subsummiert.
Danke. Ich bin mit exceptT vertraut, kann aber immer noch nicht herausfinden, wie man eine Signatur wie 'ExceptT Err (Consumer ByteString m())()' hat. Nicht sicher, ob das ein guter Weg ist, entweder weil ich versuche, die Fehlerverarbeitung oben auf der Pipeline-Ebene zu machen - etwas wie dieses " $$ ", das zu irgendeinem Zeitpunkt im "linken" Zustand ist sollte aufhören und 'Left' Fehler zurückgeben. Im Falle von 'Pipes' ist es' ExceptT e (Pipe a b m) r ', wie in dem Post erwähnt, den ich in meiner Frage verlinkt habe. –
Sal
Antwort aktualisiert mit 'Sink'. Eigentlich glaube ich nicht, dass Sie "ExceptT Err (Consumer ...)" erstellen können, da Consumer über einen seiner Typparameter universell qualifiziert ist. 'Pipe' ist nicht so definiert - es ist näher an' Sink'. Also ich denke 'AusgenommenT ... Sink ...' ist was du suchst – ErikR
Ja, ich dachte das gleiche. Vielen Dank für Ihre Hilfe. – Sal