2012-06-07 4 views
9

Es gibt einige stdlib-Funktionen, die Fehler bei ungültigen Eingaben auslösen. Zum Beispiel:Fangen Fehler mit `Fehler` geworfen?

Prelude> read "1o2" :: Int 
*** Exception: Prelude.read: no parse 

würde Ich mag es wickeln ein Either e a statt zurückzukehren. Wie kann ich das machen?

Antwort

14

There is no spoon. Sie haben es nicht von mir gehört.

Für dieses spezielle Beispiel sollten Sie stattdessen reads verwenden.

+0

Ich mag die Art und Weise Sie es ausdrückte. :) Danke für die Antwort! – missingfaktor

+6

+1 für nicht erwähnen Löffel! – is7s

2

Ich ziehe es Fehler in Werte drehen:

maybeRead :: Read a => String -> Maybe a 
maybeRead s = case reads s of 
     [(x, "")] -> Just x 
     _   -> Nothing 
+0

Ich bevorzuge das auch, aber die Frage ist, es _general_ zu tun. 'read' wird nur als Beispiel verwendet. – missingfaktor

+0

Ich denke, es ist allgemein wahr, dass es für jede Funktion, die einen Fehler gibt, eine "sichere" Version gibt. – MatrixFrog