/ / Nicht erschöpfende Muster in Haskell Liste Verständnis [Duplikat] - Haskell, Liste-Verständnis

Nicht erschöpfende Muster in Haskell Liste Verständnis [Duplikat] - Haskell, Listen-Verständnis

Mögliche Duplikate:
Warum verursachen Haskell-Listenkompromittierungen keinen Fehler, wenn die Musterübereinstimmung fehlschlägt?

Heute habe ich folgenden Code gesehen:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]

Es klappt. Aber ich dachte, dass das obige Listenverständnis nur syntaktischer Zucker ist für ...

[Just 10, Nothing, Just 20] >>= ((Just x) -> return x)

... für die Haskell beim Treffen mit der Nothing, würde einen Fehler ausgeben *** Exception: Non-exhaustive patterns in lambda.

Meine Frage ist also: Was macht? [a | Just a <- [Just 10, Nothing, Just 20]] übersetzt in (in Bezug auf monadischen Code), dass es die ignoriert Nothing?

Antworten:

2 für die Antwort № 1

Ich denke die beste Antwort diese andere Frage ist eigentlich derjenige, der auf "Compiler Magic" verweist. Sie stimmen mit dem Muster überein Just xund nach der Haskell 2010 Bericht Das Verhalten wird als angegeben

.. wenn eine Übereinstimmung fehlschlägt, wird dieses Element der Liste einfach übersprungen.

Also denke ich, dass Implementierungen frei sind, dies so zu tun, wie es ihnen gefällt (d. H. Das Entwerfen ist nicht notwendigerweise einzigartig).