2012-07-30 9 views
5

Powiel możliwe:
Why don't Haskell list comprehensions cause an error when pattern match fails?Niewyczerpujące wzór w Haskell listowego

Dziś widziałem następujący kod:

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

To działa. Ale myślałem, że powyższa lista rozumienie jest tylko cukier syntaktyczny dla ...

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

... dla których Haskell, gdy napotyka na Nothing, by emitować błąd *** Exception: Non-exhaustive patterns in lambda.

Moje pytanie brzmi: co oznacza translacja [a | Just a <- [Just 10, Nothing, Just 20]] (pod względem monadycznego kodu), która powoduje, że ignoruje ona kod Nothing?

+0

@ephemient: Dzięki! Opublikowany przeze mnie wpis odpowiada na moje pytanie. I znalazłem [inny] (http://stackoverflow.com/questions/7007222/haskell-list-comprehension-to-combinatory). Powodem, dla którego nie znalazłem tych wpisów, zanim opublikowałem moje pytanie, jest to, że nie zawierają one słowa "wyczerpujący", który jest terminem Haskella na problem. (Jestem nowicjuszem w StackOverflow i nie jestem pewien, co powinienem zrobić. Czy powinienem usunąć to pytanie? Nadal byłoby przydatne dla osób, które wpisały "[nie] wyczerpujące".) –

+0

nie trzeba usuwać - ostatecznie zostanie zamknięte jako duplikat, co oznacza, że ​​będzie duży link do góry, przesyłając ludzi tutaj z powrotem do następnej z odpowiedzią. I, jak sam zauważyłeś, bardziej przydatne jest trzymanie się, niż zabijanie :) – ephemient

Odpowiedz

2

Myślę, że najlepszą odpowiedzią w that other question jest w rzeczywistości jedna z referencji "magia kompilatora". Jesteś dopasowanie wzorca Just x i zgodnie z Haskell 2010 Report zachowanie jest określona jako

.. jeśli nie powiedzie meczu, który element listy jest po prostu pomijane.

Sądzę więc, że implementacje mogą to zrobić w dowolny sposób (tzn. Usuwanie danych niekoniecznie jest unikalne).