tipos programar programacion paso multiplicacion lenguaje funciones funcion doble clases basico aprender haskell user-defined-types

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í:

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.