2012-09-13 77 views
9

Patrones como este:¿Los patrones aritméticos son legales Haskell?

front :: [a] -> a 
front (x:_) = x 
front _ = error "Empty list" 

parecen ser comunes en Haskell, pero claramente recuerdo haber aprendido lo siguiente cuando empecé a aprender Haskell:

dec :: (Integral a) => a -> a 
dec (x+1) = x 
dec _ = error "Bottom" 

Sin embargo, ghc parece rechazar ese trozo de código , indicando:

Parse error in pattern: x + 1

Mientras que hugs lo acepta bien. Entonces, ¿es válido o no Haskell y por qué estos compiladores se comportan de manera diferente?

+0

No, no es válido. –

+0

@ ДМИТРИЙМАЛИКОВ: Entonces, ¿por qué 'abrazos' lo acepta? – bitmask

+2

@bitmask Porque abrazos no ha tenido un lanzamiento desde 2006, y 'NPlusKPatterns' se eliminaron en el estándar Haskell2010. –

Respuesta

16

Esto es lo que se conoce como el patrón n+k. Era disliked en general y se eliminó de la especificación Haskell2010 y GHC ya no la habilita por defecto a diferencia de los abrazos que no se han actualizado a la última especificación. Debe compilarse con GHCI con la bandera -XNPlusKPatterns habilitada.

Ver this para más detalles.

9

En haskell 98 esto es legal, pero fue prohibido en haskell 2010, y esto es lo que implementan versiones recientes de GHC. Abrazos, por otra parte, no se ha actualizado desde hace años, e implementa Haskell 98.

n + k patrones no les gustan ya que puede existen números que coinciden, por ejemplo n+1 pero no hay n que encajaría que n+1.

Considere números de punto flotante: Existe un número que se adapte a n+1 (4294967296 :: Float es el n + 1 para 4294967295, pero este número no se pueden montar en un Float - comparar round (4294967296 :: Float) y round (4294967295 :: Float), tanto el rendimiento 4294967296) .

También puede haber rebote + (haskell soporta sobrecarga del operador) entonces, ¿qué significaría la coincidencia de patrón? Para evitar tales ambigüedades, los patrones n + k fueron desautorizados.

Si desea utilizar n + k patrón de todos modos, se puede utilizar un lenguaje pragma en la parte superior de los archivos de origen:

{-# LANGUAGE NPlusKPatterns #-} 

PS: Creo que todo empezó en this email thread.

Cuestiones relacionadas