Richtiger Weg zur gewaltsamen Umwandlung von a nach a in Elm, wobei Nothings nicht klar ist

8

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:

  • Verwenden Sie einfach withDefault . Ich habe einen Standardwert von 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.
  • Machen Sie ein wenig mit Ports zu tun, um mit Javascript zu interagieren und eine Ausnahme auszulösen, wenn es nichts gibt. Ich habe noch nicht genau untersucht, wie das funktioniert, aber anscheinend ist es möglich. Aber das scheint nur zu viele Abhängigkeiten für etwas zu verwechseln, was sonst einfach reines Elm wäre.
betaveros 24.02.2015, 15:30
quelle

2 Antworten

6

(Beantworte meine eigene Frage)

Ich habe zwei mehr befriedigende Lösungen gefunden:

  • Rollen Sie meine eigene, teilweise definierte Funktion, die an anderer Stelle in der verknüpften Diskussion referenziert wurde . Aber der Code fühlt sich auf diese Weise unvollständig an (ich würde hoffen, der Compiler würde mich eines Tages über unvollständige Musterübereinstimmungen warnen) und die Fehlermeldung ist immer noch unklar.
  • 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.

    %Vor%

    (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.)

betaveros 24.02.2015 15:30
quelle
2

Lösung

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:

  1. 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.

  2. 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:

    %Vor%

    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 .

Vorbehalt

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.

Beispiel: Versuch, eine Liste zu filtern und den Wert abzurufen.

Nehmen wir an, Sie haben eine Liste von Maybe s, für die Sie Werte haben möchten. Eine gemeinsame Strategie könnte sein:

%Vor%

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:

%Vor%     
Mezuzza 15.01.2017 00:59
quelle

Tags und Links