2012-07-30 14 views
5

Duplicar posibles:
Why don't Haskell list comprehensions cause an error when pattern match fails?patrón no exhaustiva en Haskell lista por comprensión

Hoy he visto el siguiente código:

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

Funciona. Pero pensé que la lista anterior es la comprensión de azúcar sintáctica para simplemente ...

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

... para los que Haskell, cuando se enfrentan a la Nothing, emitiría un error *** Exception: Non-exhaustive patterns in lambda.

Así que mi pregunta es: ¿en qué se traduce [a | Just a <- [Just 10, Nothing, Just 20]] (en términos de código monádico) que hace que ignore el Nothing?

+0

@ephemient: ¡Gracias! La publicación a la que vinculó responde mi pregunta. Y he encontrado [otro] (http://stackoverflow.com/questions/7007222/haskell-list-comprehension-to-combinatory). La razón por la que no encontré estas publicaciones antes de publicar mi pregunta es porque no contienen la palabra "exhaustiva", que es el término de Haskell para el problema. (Soy nuevo en StackOverflow y no estoy seguro de lo que se supone que debo hacer. ¿Debo eliminar esta pregunta? Todavía sería útil para las personas que escribirían "[no-] exhaustivo".) –

+0

Usted no es necesario eliminar - eventualmente se cerrará como un duplicado, lo que significa que habrá un enlace grande arriba reenviando personas de aquí a la próxima con la respuesta. Y, como nota, es más útil mantenerse cerca que matar :) – ephemient

Respuesta

2

Creo que la mejor respuesta en that other question es en realidad la que hace referencia a 'magic compilador'. Estamos buscando el patrón Just x, y de acuerdo con la Haskell 2010 Report el comportamiento se especifica como

.. si un partido falla, entonces ese elemento de la lista es simplemente pasó por alto.

Así que creo que las implementaciones son libres de hacer esto cuando lo deseen (es decir, el desgrase no es necesariamente único).

Cuestiones relacionadas