115 Stimmen

Warum gibt Haskell's Prelude.read kein Maybe zurück?

Gibt es einen guten Grund, warum der Typ von Prelude.read

read :: Read a => String -> a

statt der Rückgabe einer Maybe Wert?

read :: Read a => String -> Maybe a

Da die Zeichenkette möglicherweise nicht in Haskell geparst werden kann, wäre dann nicht letzteres die natürlichere Lösung?

Oder sogar eine Either String a donde Left würde die ursprüngliche Zeichenkette enthalten, wenn sie nicht geparst wurde, und Right das Ergebnis, wenn es so wäre?

Edita:

Ich versuche nicht, andere dazu zu bringen, einen entsprechenden Wrapper für mich zu schreiben. Ich suche nur die Gewissheit, dass es sicher ist, dies zu tun.

14 Stimmen

Warum ist die take akzeptieren jede Num a => a ? Warum gibt es einen besonderen Fall von fmap für Listen? Warum ist Functor nicht erforderlich für Monad Instanzen? Ich erwarte, dass die Antwort ähnlich ausfallen wird wie die Antworten auf diese und ähnliche Fragen.

3 Stimmen

Nun, deshalb habe ich es so formuliert und die Möglichkeit offen gelassen, dass es keinen guten Grund gibt. Ich vermute zwar auch, dass es keinen gibt, wie bei den bekannten Beispielen, die Sie anführen, aber es ist eine Frage wert, um sicherzugehen, dass das Schreiben eines eigenen Wrappers keine unvorhergesehenen Probleme nach sich zieht.

0 Stimmen

Ich hoffe, ein readMaybe Funktion wird demnächst hinzugefügt werden.

115voto

sclv Punkte 38177

bearbeiten : Ab GHC 7.6, readMaybe ist verfügbar in der Text.Read Modul im Basispaket, zusammen mit readEither : http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe


Gute Frage! Die Art des Lesens selbst wird sich in nächster Zeit nicht ändern, denn das würde viele Dinge kaputt machen. Allerdings gibt es sollte ein sein maybeRead Funktion.

Warum gibt es sie nicht? Die Antwort lautet "Trägheit". Es gab eine Diskussion im Jahr '08 die durch eine Diskussion über "Fail" entgleist ist.

Die gute Nachricht ist, dass die Leute hinreichend davon überzeugt waren, die Bibliotheken nicht mehr zu vernachlässigen. Die schlechte Nachricht ist, dass der Vorschlag im Durcheinander unterging. Dort sollte eine solche Funktion sein, obwohl eine solche leicht zu schreiben ist (und es gibt Zillionen sehr ähnlicher Versionen, die in vielen Codebasen herumschwirren).

Siehe auch diese Diskussion .

Ich persönlich verwende die Version aus dem sichere Verpackung .

32voto

augustss Punkte 22622

Ja, es wäre praktisch, wenn es eine Lesefunktion gäbe, die Maybe zurückgibt. Sie können selbst eine erstellen:

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

3 Stimmen

Ich danke Ihnen! Ich hoffe, die Bearbeitung klingt nicht undankbar! :) Ich will nur klarstellen, dass ich nicht aus Faulheit frage...

6 Stimmen

Wenn @augustss sie nicht geben kann, gibt es vielleicht keine bessere Antwort.

2 Stimmen

Ich glaube nicht, dass im ursprünglichen Entwurf jemals eine "Maybe"-Version vorgesehen war. Viele dieser Dinge werden mit der Erfahrung offensichtlich, sind aber schwer vorherzusagen.

15voto

yatima2975 Punkte 6540

Abgesehen von Trägheit und/oder wechselnden Einsichten könnte ein weiterer Grund darin liegen, dass es ästhetisch ansprechend ist, eine Funktion zu haben, die als eine Art Umkehrung von show . Das heißt, Sie wollen, dass read . show ist die Identität (für Typen, die eine Instanz von Show y Read ) und dass show . read ist die Identität im Bereich von show (d.h. show . read . show == show )

Mit einer Maybe in der Art von read bricht die Symmetrie mit show :: a -> String .

12voto

lpsmith Punkte 707

Wie @augustss schon sagte, können Sie Ihre eigene sichere Lesefunktion erstellen. Allerdings ist seine readMaybe ist nicht ganz konsistent mit read, da es Leerzeichen am Ende einer Zeichenkette nicht ignoriert. (Ich habe diesen Fehler einmal gemacht, ich erinnere mich nicht mehr genau an den Kontext)

Die Betrachtung der Definition von read im Haskell 98-Bericht können wir es ändern, um eine readMaybe die vollkommen im Einklang steht mit read und das ist nicht allzu lästig, weil alle Funktionen, von denen es abhängt, im Vorspiel definiert sind:

readMaybe        :: (Read a) => String -> Maybe a
readMaybe s      =  case [x | (x,t) <- reads s, ("","") <- lex t] of
                         [x] -> Just x
                         _   -> Nothing

1 Stimmen

Danke! +1 dafür, dass Sie mich auf das Problem der Leerzeichen aufmerksam gemacht haben, auf das ich vorher nicht hingewiesen hatte.

3 Stimmen

Beachten Sie, dass Sie, wenn Sie nur die safe Paket, erhalten Sie eine korrekte Version von readMaybe verfügbar (es heißt readMay und sie ist identisch mit dieser Version.

8voto

amindfv Punkte 8348

Diese Funktion (genannt readMaybe ) ist jetzt im Haskell-Vorspiel enthalten! (Ab der aktuellen Basis -- 4.6)

2 Stimmen

Nun, der verlinkte Text sagt, dass es in Text.Read und nicht in Prelude ist (kann sich geändert haben), aber es hat mir trotzdem geholfen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X