2012-07-30 11 views
5

Eventuali duplicati:
Why don't Haskell list comprehensions cause an error when pattern match fails?modello non esaustivo nella lista Haskell comprensione

Oggi ho visto il seguente codice:

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

Funziona. Ma ho pensato che l'elenco di cui sopra di comprensione è lo zucchero sintattico per ...

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

... per i quali Haskell, quando incontra il Nothing, emetterebbe un errore *** Exception: Non-exhaustive patterns in lambda.

Quindi la mia domanda è: cosa si traduce in [a | Just a <- [Just 10, Nothing, Just 20]] (in termini di codice monadico) che ignora lo Nothing?

+0

@ephemient: Grazie! Il post che hai collegato per rispondere alla mia domanda. E ho trovato [un altro] (http://stackoverflow.com/questions/7007222/haskell-list-comprehension-to-combinatory). Il motivo per cui non ho trovato questi post prima di pubblicare la mia domanda è perché non contengono la parola "esauriente", che è il termine di Haskell per il problema. (Sono nuovo di StackOverflow e non sono sicuro di cosa dovrei fare. Devo eliminare questa domanda? Sarebbe comunque utile per le persone che digiteranno "[non-] esauriente".) –

+0

Tu non è necessario eliminarlo, ma alla fine verrà chiuso come duplicato, il che significa che ci sarà un grosso collegamento con le persone che inoltreranno le persone da qui a quello successivo con la risposta. E, come si nota, è più utile mantenere in giro che uccidere :) – ephemient

risposta

2

Penso che la migliore risposta in that other question sia effettivamente quella che fa riferimento al "compilatore magico". Stai corrisponde al modello Just x, e secondo il Haskell 2010 Report il comportamento è specificato come

.. se un match fallisce allora che elemento della lista è semplicemente saltato.

Quindi penso che le implementazioni siano libere di fare ciò a loro piacimento (ad esempio, il desugaring non è necessariamente unico).

Problemi correlati