learn - type definition haskell
¿Qué es esta sintaxis haskell? (1)
Acabo de encontrar la siguiente sintaxis en un fragmento de código de Haskell:
data A = A Int Int | B
m :: A -> Int
m a = case a of
A{} -> 1
_ -> 2
¿Qué está haciendo la A{}
aquí? ¿La {}
coincide automáticamente con cualquier número de argumentos?
Tengo la sensación de que esto está explotando el hecho de que Haskell registra las sinasis de sintaxis en un montón de funciones y un tipo de datos algebraico regular. ¿Es ese el caso?
Sí, A{}
coincide con cualquier valor construido con el constructor A
, independientemente de si el tipo se ha declarado con o sintaxis de registro.
El informe de idioma especifica
La expresión F {}, donde F es un constructor de datos, es legal si F fue declarada o no con sintaxis de registro (siempre que F no tenga campos estrictos; consulte la cuarta viñeta arriba); denota F ⊥1 ... ⊥n, donde n es la aridad de F.
La ''cuarta viñeta'' mencionada en el paréntesis indica que es un error estático construir un valor con sintaxis de registro que omita un campo estricto.
Y en la sección sobre coincidencia de patrones , una de las reglas gramaticales para patrones es
apat -> qcon { fpat1 , … , fpatk } (labeled pattern, k ≥ 0)
y la semántica se da en la subsección sobre semántica formal de emparejamiento de patrones (3.17.3) como
(o) case v of { K {} -> e ; _ -> e′ }
= case v of {
K _… _ -> e ; _ -> e′ }