2012-01-18 45 views
28

Acabo de funcionar a través de la siguiente sintaxis en una pieza de código Haskell -¿Qué es esta sintaxis haskell?

data A = A Int Int | B 

m :: A -> Int 
m a = case a of 
    A{} -> 1 
    _ -> 2 

Cuál es el A{} haciendo aquí? ¿El {} coincide automáticamente con cualquier cantidad de argumentos?

Tengo la sensación de que esto explota el hecho de que Haskell registra la sintaxis desúbula a un conjunto de funciones y un tipo de datos Algebraico regular. Es ese el caso?

+5

Aprende algo nuevo todos los días, y he estado programando Haskell durante 5 años; Nunca he visto la sintaxis en mi vida. –

Respuesta

28

Sí, A{} coincide con cualquier valor construido con el constructor A, independientemente de si el tipo ha sido declarado con sintaxis de registro o no.

El language report especifica

la expresión f {}, donde F es un constructor de datos, es legal o no F se declara con la sintaxis de registro (siempre que F no tiene campos estrictas - ver el cuarto punto por encima); denota F ⊥1 ... ⊥n, donde n es el aridad de F.

La 'cuarta bala' mencionado en el paréntesis indica que se trata de un error estático de construir un valor con la sintaxis de registro que omite una estricta campo.

Y en el apartado de pattern matching, una de las reglas gramaticales para los patrones es

apat -> qcon { fpat1 , … , fpatk }  (labeled pattern, k ≥ 0) 

y la semántica se dan en el apartado de la semántica formal de reconocimiento de patrones (3.17.3) como

(o) case v of { K {} -> e ; _ -> e′ } 
     = case v of { 
      K _… _ -> e ; _ -> e′ } 
+3

Esta sintaxis es útil, porque incluso si la cantidad de argumentos para el constructor 'A 'cambia, la definición de la función no tiene por qué cambiar. Con la coincidencia de patrones regular (por ejemplo, 'A _ _ -> ...') este no sería el caso. –

+0

@Daniel - aún en este caso no estamos hablando de expresiones, sino de patrones. Creo que 'F {}' debería ser equivalente a 'F _1 _2 ... _n' donde * n * es la aridad del constructor. – Ingo

+0

@Ingo Derecho. Solo miré la sección de 'semántica informal' anoche, no encontré nada allí, pero la parte de la expresión se destacó. Lo encontré en la sección de semántica formal después de unas horas de sueño. –