2017-12-27 17 views
1

Ich habe zwei either Werte, zum Beispiel:Fehler auf mehrere Entweder Umgang Werte

Either String Config -- error string or config parsed 
Either String Env  -- error string or environment variables detected 

Und ich mag ihre Werte in diesen Datensatz extrahieren:

type App = App { config :: Config, env :: Env } 

während schnell versagt, wenn es waren Fehler (der Left Wert auf einem dieser beiden Werte).

Ich könnte zwei case Aussagen verwenden, aber ich frage mich, ob es bereits eine Abstraktion gibt, die ich hier verwenden kann?

Idealerweise würde ich eine Nachricht bei einem Fehler protokollieren und das Programm sofort beenden.

Antwort

6

Sie können die Tatsache verwenden, dass Either String ein Applicative für solche Dinge ist.

Unter der Annahme,

mcnf :: Either String Config 
menv :: Either String Env 

können Sie schreiben

mapp :: Either String App 
mapp = App <$> mcnf <*> menv 
+1

Dank. Auch benutze ich 'System.Exit.die' in' entweder', um mit Fehlern umzugehen: https://github.com/srid/slownews/commit/a80134c4d918e8b258ae3f1115a62c99ae9b601f –

+0

Klingt richtig! – gallais