Gibt es einen guten Grund, warum die Art von Prelude.read ist
read :: Read a => String -> a
anstatt einen Maybe
Wert zurückzugeben?
read :: Read a => String -> Maybe a
Wäre letzteres nicht natürlicher, da die Zeichenfolge möglicherweise nicht analysierbar ist, Haskell?
Oder sogar eine Either String a
, wo Left
würde die ursprüngliche Zeichenfolge enthalten, wenn sie nicht analysiert würde, und Right
das Ergebnis, wenn dies der Fall wäre?
Bearbeiten:
Ich versuche nicht, andere dazu zu bringen, einen entsprechenden Wrapper für mich zu schreiben. Ich suche nur die Bestätigung, dass dies sicher ist.
take
akzeptiert keineNum a => a
? Warum gibt es einen Sonderfallfmap
für Listen? Warum istFunctor
fürMonad
Instanzen nicht erforderlich ? Ich erwarte, dass die Antwort den Antworten auf diese und verwandte Fragen ähnlich ist.readMaybe
, dass bald eine Funktion hinzugefügt wird.take
seinIntegral n => n -> [a] -> [a]
?Integral
, nichtNum
- Hirnfurz.Antworten:
Bearbeiten : Ab GHC 7.6
readMaybe
ist dasText.Read
Modul im Basispaket verfügbar , zusammen mitreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybeGute Frage! Die Art des Lesens selbst ändert sich nicht so schnell, da dies viele Dinge kaputt machen würde. Es sollte jedoch eine
maybeRead
Funktion geben.Warum gibt es nicht? Die Antwort lautet "Trägheit". Es gab eine Diskussion in '08, die durch eine Diskussion über "scheitern" entgleist wurde.
Die gute Nachricht ist, dass die Leute ausreichend überzeugt waren, um nicht in den Bibliotheken zu scheitern. Die schlechte Nachricht ist, dass der Vorschlag im Shuffle verloren gegangen ist. Es sollte eine solche Funktion sein, obwohl man ist einfach zu schreiben (und es gibt Myriaden von sehr ähnliche Versionen im Umlauf viele Codebases).
Siehe auch diese Diskussion .
Persönlich verwende ich die Version aus dem sicheren Paket .
quelle
Ja, es wäre praktisch mit einer Lesefunktion, die Vielleicht zurückgibt. Sie können selbst eine erstellen:
quelle
Read a
Typklasse:readMaybe :: Read a => String -> Maybe a
Abgesehen von Trägheit und / oder sich ändernden Einsichten könnte ein weiterer Grund sein, dass es ästhetisch ansprechend ist, eine Funktion zu haben, die als eine Art Umkehrung von wirken kann
show
. Das heißt, Sie möchten, dass diesread . show
die Identität ist (für Typen, die eine Instanz vonShow
und sindRead
) und dass diesshow . read
die Identität im Bereich vonshow
(dhshow . read . show == show
) ist.Ein
Maybe
in der Art vonread
bricht die Symmetrie mitshow :: a -> String
.quelle
newtype ValidShow a = ValidShow String
. Der Phantomtyp macht es typsicherer.showThing :: Show a => a -> ValidShow a
undreadThing :: Read a => ValidShow a -> a
, damit der Typ des angezeigten Objekts im ValidShow-Objekt gespeichert wird. Auf diese Weise können Sie nicht schreibenreadThing (showThing True) :: String
.Wie @augustss hervorhob, können Sie Ihre eigene sichere Lesefunktion erstellen. Jedoch sein
readMaybe
stimmt jedoch nicht vollständig mit dem Lesen überein, da Leerzeichen am Ende eines Strings nicht ignoriert werden. (Ich habe diesen Fehler einmal gemacht, ich erinnere mich nicht ganz an den Kontext)Wenn wir uns die Definition des Lesens im Haskell 98-Bericht ansehen, können wir sie so ändern, dass sie eine implementiert
readMaybe
, die perfekt mit dem übereinstimmt.read
Dies ist nicht allzu unpraktisch, da alle Funktionen, von denen es abhängt, im Prelude definiert sind:quelle
safe
Paket verwenden, eine korrekte Version vonreadMaybe
verfügbar erhalten (es heißtreadMay
und ist identisch mit dieser Version.Diese Funktion (aufgerufen
readMaybe
) befindet sich jetzt im Haskell-Vorspiel! (Stand der aktuellen Basis - 4.6)quelle