programar - haskell paso a paso
Haskell: ¿Por qué se necesita espacio adicional en la secuencia aritmética para la enumeración definida por el usuario? (1)
Esta pregunta ya tiene una respuesta aquí:
- Creando lista infinita de respuestas ADT 5
Entonces, para cualquier tipo incorporado en Haskell, puedo construir una secuencia aritmética, como esta (para Int
o Integer
, etc.)
[1..5]
Pero si defino un tipo de enumeración como:
data Suit = Club | Diamond | Heart | Spade deriving (Show, Enum)
cuando creo una secuencia aritmética, debo incluir un espacio antes de una instancia de enumeración y el punto punto, por ejemplo
[Club .. Diamond]
¿Por qué?
El problema es que, de acuerdo con las reglas léxicas de Haskell , modid.varsym
es una referencia a una variable en un módulo. Un modid
es una secuencia de 1 o más identificadores en mayúsculas separados por puntos y un varsym
es un nombre simbólico. Club
es válido y válido .
es un varsym
válido (tenga en cuenta que incluso hay un operador en Prelude con ese nombre y al que se puede acceder como Prelude..
). Entonces, X..
se ve como el nombre calificado de una variable llamada .
en el módulo X
.
Así que Club..Diamond
es tokenizado como "nombre de variable calificado, nombre de constructor", no "nombre de constructor, dotdot, nombre de constructor" 1 . Y cuando intenta resolver el nombre de la variable calificada, falla porque en realidad no hay un módulo llamado Club
.
El problema no se produce con [1..5]
porque 1
no es un nombre de módulo válido, ni existe otra forma en que 1..
o 1.
formen un token válido. Tenga en cuenta que, a diferencia de algunos idiomas, 1.
no está permitido como una forma más corta de escribir 1.0
. Si lo fuera, se encontraría con un problema similar porque 1..5
ahora se tokenizaría como "número, punto, número". Pero no es así, por lo que el problema no se produce.
1 "Nombre de variable calificado" gana sobre "nombre de constructor, dotdot" debido a la regla de munch máxima, que dice que cuando hay múltiples posibilidades de emparejar un token, tome la que coincida con la subcadena más larga de la posición actual.