2010-02-11 23 views
9

Soy bastante nuevo en Haskell pero obtengo la mayoría de los conceptos básicos. Sin embargo, hay una cosa que no puedo entender. Considere mi ejemplo a continuación:¿Por qué mi función Haskell no acepta números negativos?

example :: Int -> Int 
example (n+1) = ..... 

El (n + 1) parte de este ejemplo de alguna manera impide la entrada de números negativos, pero no puedo entender cómo. Por ejemplo ... Si la entrada fuera (-5), esperaría que n fuera solo (-6) ya que (-6 + 1) es (-5). La salida al realizar la prueba es la siguiente:

Program error: pattern match failure: example (-5)

¿Alguien puede explicarme por qué esto no acepta números negativos?

+8

Tenga en cuenta que los patrones 'n + k' se eliminarán de la próxima versión de la especificación del lenguaje Haskell (Haskell 2010). Hasta donde yo sé, rara vez se usan en la práctica (aunque estoy seguro de que alguien encontrará un ejemplo anecdótico). Entonces sugeriría no usarlos. –

Respuesta

10

así es como n+k patterns se define a trabajar:

Matching an n+k pattern (where n is a variable and k is a positive integer literal) against a value v succeeds if x >= k, resulting in the binding of n to x - k, and fails otherwise.

El punto de n + k patrones es llevar a cabo la inducción, por lo que necesita para completar el ejemplo con un caso base (k-1 o 0 en este caso), y decidir si un parámetro menor que eso sería un error o no. De esta manera:

example (n+1) = ... 
example 0 = ... 

La semántica que básicamente estás pidiendo sería bastante inútil y redundante - usted podría decir

example n = let n' = n-1 in ... 

para lograr el mismo efecto. El objetivo de un patrón es fallar algunas veces.

+1

Mi profesor lo usó sin explicar cómo o por qué funcionó. Lo has explicado bien. Gracias. –

Cuestiones relacionadas