Leere Liste vs Vielleicht, um eine fehlerhafte Berechnung in Haskell darzustellen

7

In dem Edx Haskell Kurs erklärt Erik Meijer wiederholt, dass co_de% type für fehlgeschlagene Berechnungen ist nicht etwas, was man tun sollte; stattdessen sollte man die leere Liste dafür verwenden.

Ich verstehe, dass der Maybe -Typ eine gute Sache ist und dass wir ihn verwenden sollten. Es scheint jedoch, dass eine Liste alles modellieren kann, was ein Maybe modellieren kann und mehr ... Also, warum brauchen wir überhaupt den Typ Maybe ?

    
user3139545 24.11.2014, 10:28
quelle

5 Antworten

7

Eine Liste kann eine beliebige Anzahl von Ergebnissen modellieren. Auf der anderen Seite, Maybe Modelle genau eins Ergebnis oder kein Ergebnis .

Denken Sie über die folgenden Funktionen nach:

%Vor%

Es ist nicht klar, wie viele Elemente f1 , f2 , f3 oder f4 return. Was passiert also, wenn Sie sie sequenzieren?

%Vor%

Wie viele Elemente sollte das Ergebnis enthalten? Ein? Null? Haben wir versehentlich eine Liste mit n ^ n (n ~ input length) -Elementen erstellt?

Wenn die Berechnungen jedoch genau einen Wert oder keinen Wert zurückgeben, gibt uns der richtige Typ sofort alle notwendigen Informationen:

%Vor%

Also das ist es. Nun zurück zu Meijers Aussage:

  

Erik Meijer stellt wiederholt fest, dass die Verwendung des Maybe-Typs für fehlgeschlagene Berechnungen nichts ist, was man tun sollte; stattdessen sollte man die leere Liste dafür verwenden.

Ohne zusätzliche objektive Gründe ist dies nur eine persönliche Präferenz. Ich könnte jedem sagen, dass fmap besser ist als map , es ist etwas, was wir tun sollten. Und an diesem Punkt glaubst du mir entweder oder stellst Fragen. Wenn er es in seinem Vortrag nicht klarstellte, frage ihn direkt.

    
Zeta 24.11.2014, 13:21
quelle
17
  

Es scheint jedoch, dass eine Liste alles modellieren kann, was ein Maybe modellieren kann und mehr

Das "und mehr" ist ein guter Grund, Maybe zu verwenden. Als Verbraucher einer Liste müssen Sie null, einen oder mehrere Werte verarbeiten können. Als Konsument eines Maybe müssen Sie nur in der Lage sein, mit null oder einem Wert umzugehen. In Fällen, in denen mehrere Werte keinen Sinn ergeben, ist es besser, Maybe zu verwenden, damit Sie statisch wissen, dass Sie keine unsinnigen Werte erhalten.

    
Ganesh Sittampalam 24.11.2014 10:38
quelle
1

zugunsten von Listen:

  • Die zusätzlichen Werte sind kein Problem. Der Client kann immer wählen, den Rest der Liste zu ignorieren, wenn mehr als ein Ergebnis vorhanden ist.

  • Die Verwendung von Listen vermeidet langwierige Konvertierungen zwischen Maybe und Listen, wenn wir beide mischen müssen. Keine Notwendigkeit für listToMaybe oder maybeToList .

  • catMaybes wird nur concat (oder join ).

Eine mögliche Sorge ist, dass wiederholte Verwendung von (>>=) für die Listenmonade wirklich große Listen erstellen kann. Haskell ist jedoch faul. Wenn wir nur das erste Element verwenden, wird der Rest der Liste nicht berechnet.

%Vor%     
danidiaz 24.11.2014 21:39
quelle
1

Ich denke, ich würde hier dem Chor beitreten und sagen, dass ich Meijers Empfehlung nicht bewerten kann, wenn mir nicht alle Einzelheiten seines Arguments dafür vorgelegt werden. Mir scheint es einfach zu sein:

  1. Verwenden Sie Maybe für Funktionen, die 0 oder 1 Ergebnisse zurückgeben.
  2. Verwenden Sie [] für Funktionen, die 0 oder mehr Ergebnisse zurückgeben.
  3. Wenn Sie zwischen Funktionen, die unterschiedliche Auswahlmöglichkeiten haben, mischen müssen, können Sie Funktionen wie listToMaybe :: [a] -> Maybe a und maybeToList :: Maybe a -> [a] von Data.Maybe , um Funktionen, die in einem Stil geschrieben wurden, an den anderen anzupassen.
  4. Wenn Sie die Entscheidung, ob Maybe oder [] verwendet werden soll, verschieben möchten, können Sie die Klassen Alternative oder MonadPlus verwenden.

Beispiel für Punkt 4:

%Vor%     
Luis Casillas 26.11.2014 02:10
quelle
0

Ein weiterer wichtiger Punkt von Maybe ist, dass es nur der einfachste Fall von Fehlerbehandlungs-Monaden ist, die verwendet werden können, um "brechbare" Berechnungen auf bequeme und konsistente Weise darzustellen und zu bilden (ein anderes Beispiel sind Entweder und reine Ausnahmen). Die Listen-Monade ist semantisch verschieden (sie repräsentiert nicht-deterministische Berechnungen) und hat ein ähnliches Verhalten nur im Leer- / Singleton-Fall, wie oben gezeigt.

    
Yuuri 24.11.2014 13:44
quelle

Tags und Links