tipos sintaxis pattern otherwise librerias imprimir importar ejemplos datos como ciclos basica haskell pattern-matching

sintaxis - Que es más eficiente en Haskell; coincidencia de patrones o declaraciones if/case anidadas?



sintaxis basica de haskell (3)

Solo tengo curiosidad sobre la eficacia de la coincidencia de patrones en Haskell. ¿Cuál es el caso simple de que la coincidencia de patrones sería mejor que las declaraciones if / case anotadas y luego el inverso?

Gracias por tu ayuda.


En Haskell, la coincidencia de case y patrones está inextricablemente unida; no puedes tener uno sin el otro. if p then e1 else e2 es azúcar sintáctico para el case p of { True -> e1; False -> e2 } case p of { True -> e1; False -> e2 } . Por estas razones, creo que es imposible producir los ejemplos que pides; en Core Haskell, todo es equivalente al case .

En los idiomas de la familia ML, el optimizador a menudo puede hacer cosas impresionantes con combinaciones complejas de patrones. Esto es más difícil para los compiladores de Haskell; Debido a la evaluación perezosa, el compilador de coincidencia de patrones no puede reordenar ciertas pruebas. En otras palabras, si anida las declaraciones de case de diferentes maneras, puede obtener un rendimiento diferente, pero en Haskell también obtiene una semántica diferente. Entonces, en general, el compilador no se equivoca.

En cuanto a la forma de escribir su propio código, es seguro suponer que el código con la menor cantidad de expresiones de casos es el mejor (teniendo en cuenta que uno es equivalente a una expresión de caso).


No confirmé esto, pero creo que ambas formas se convertirán en una expresión de caso anidada cuando el compilador las traduzca al núcleo de Haskell. La mejor forma de averiguarlo es preguntándole al compilador. En GHC puede activar el volcado del programa intermedio central utilizando los argumentos:

  • Antes de las simplificaciones: -ddump-ds
  • Después de las simplificaciones: -ddump-simpl

De acuerdo con la especificación, son semánticamente equivalentes . Esto, por supuesto, no significa necesariamente que se implementen de manera idéntica, pero personalmente me sorprendería si hubiera una diferencia en un compilador decente.