Okay, was ich wirklich wollte, ist, ich habe ein Array und ich möchte ein zufälliges Element daraus auswählen. Es ist naheliegend, eine Ganzzahl aus einem Zufallszahlengenerator zwischen 0 und der Länge minus 1 zu erhalten, die ich bereits verwendet habe, und dann Array.get , aber das gibt Maybe a
zurück. (Es scheint, dass es auch eine Paketfunktion gibt, die das gleiche tut .) Wenn ich von Haskell komme, bekomme ich die Typbedeutung, dass es mich vor dem Fall schützt, dass mein Index außer Reichweite ist, aber ich habe Kontrolle über den Index und erwarte nicht, dass das passiert. Ich mag einfach Ich nehme an, ich habe ein Just
etwas und etwas gewaltsam in a
umgewandelt. In Haskell wäre das fromJust
oder, wenn ich mich verbal fühle, fromMaybe (error "some message")
. Wie soll ich das in Elm machen?
Ich fand eine Diskussion auf der Mailing-Liste , die darüber zu diskutieren scheint. Aber es ist eine Weile her, und ich sehe nicht die Funktion, die ich in der Standardbibliothek haben möchte, wo die Diskussion es vorschlägt.
Hier sind einige ziemlich unbefriedigende mögliche Lösungen, die ich bis jetzt gefunden habe:
a
zur Verfügung, aber ich mag das nicht, da es meinem Code eine völlig falsche Bedeutung gibt und das Debugging wahrscheinlich die Arbeit im Nachhinein erschwert. (Beantworte meine eigene Frage)
Ich habe zwei mehr befriedigende Lösungen gefunden:
Pattern-match und Debug.crash wenn es ist ein Nichts. Dies scheint Haskells error
ähnlich zu sein und ist die Lösung, auf die ich mich momentan stütze.
(Der Modulname und die Beschreibung lassen mich auch zögern, weil es nicht die "richtige" Methode ist, die für meine Zwecke gedacht ist. Ich möchte anstelle eines bloßen Debugging einen wahren Programmiererfehler anzeigen.)
Die Existenz oder Verwendung einer fromJust
oder äquivalenten Funktion ist eigentlich ein Code-Geruch und sagt Ihnen, dass die API nicht korrekt entworfen wurde. Das Problem ist, dass Sie versuchen, eine Entscheidung darüber zu treffen, was zu tun ist, bevor Sie die Informationen dazu haben. Sie können sich das in zwei Fällen vorstellen:
Wenn Sie wissen, was Sie mit Nothing
machen sollen, dann ist die Lösung einfach: Verwenden Sie withDefault
. Dies wird offensichtlich, wenn Sie auf den richtigen Punkt in Ihrem Code schauen.
Wenn Sie nicht wissen, was Sie tun sollen, wenn Sie Nothing
haben, aber dennoch Änderungen vornehmen möchten, müssen Sie dies anders machen. Anstatt den Wert aus dem Maybe
zu ziehen, verwenden Sie Maybe.map
, um den Wert zu ändern, während Maybe
beibehalten wird. Nehmen wir als Beispiel an, dass Sie Folgendes tun:
Stattdessen werden Sie das wollen:
%Vor% Beachten Sie, dass die gewünschte Änderung in diesem Fall immer noch erfolgt. Sie haben den Fall, in dem Sie eine Nothing
haben, einfach nicht behandelt. Sie können diesen Wert nun in der Aufrufkette nach oben und nach unten verschieben, bis Sie eine Stelle erreicht haben, an der es natürlich ist, withDefault
zu verwenden, um Maybe
loszuwerden.
Was passiert ist, ist, dass wir die Bedenken von "Wie ändere ich diesen Wert" und "Was mache ich, wenn es nicht existiert?" getrennt haben. Wir behandeln die erste mit Maybe.map
und die letztere mit Maybe.withDefault
.
Es gibt eine kleine Anzahl von Fällen, in denen Sie einfach wissen , dass Sie einen Just
-Wert haben und ihn wie oben beschrieben mit fromJust
eliminieren müssen, aber diese Fälle sollten selten und weit sein zwischen. Es gibt einige, die tatsächlich eine einfachere Alternative haben.
Nehmen wir an, Sie haben eine Liste von Maybe
s, für die Sie Werte haben möchten. Eine gemeinsame Strategie könnte sein:
Es stellt sich heraus, dass auch in diesem Fall saubere Möglichkeiten zur Vermeidung von fromJust
bestehen. Die meisten Sprachen mit einer Sammlung, die eine Karte und einen Filter hat, haben eine Methode zum Filtern mit einem eingebauten Maybe
. Haskell hat Maybe.mapMaybe
, Scala hat flatMap
und Elm hat List.filterMap
. Dies verwandelt deinen Code in: