20 votos

Por qué Haskell gama necesita espacios al utilizar [LT... ¿GT]?

Por qué es que cuando se van en Haskell, esto funciona:

[LT .. GT]

pero esto no:

[LT..GT]

y qué significa este error críptico:

<interactive>:1:2:
    Failed to load interface for `LT':
      Use -v to see a list of the files searched for.

<interactive>:1:2:
    A section must be enclosed in parentheses thus: (`LT..` GT)

Sin embargo, cuando uso Ints, trabaja la segunda forma (sin espacios):

[1..3]

27voto

KennyTM Puntos 232647

Es porque LT.. se interpreta como el . operador LT módulo.


<interactive>:1:2:
    Failed to load interface for `LT':
      Use -v to see a list of the files searched for.

Esto significa GHC no puede encontrar un módulo denominado LT. El mismo mensaje aparece si utiliza un nombre completo con un no-existente de la biblioteca:

Prelude> SDJKASD.sdfhj

<interactive>:1:1:
    Failed to load interface for `SDJKASD':
      Use -v to see a list of the files searched for.

<interactive>:1:2:
    A section must be enclosed in parentheses thus: (`LT..` GT)

En Haskell, una sección es un operador infijo con un parcial de aplicación, por ejemplo (* 3), que es equivalente a \x -> x * 3.

En su caso, LT.. se interpreta como un infijo . , y el operador GT es parte de la sección de formado con este operador.

Una sección debe estar entre paréntesis, y puesto que la interpretación no, el analizador se quejan de como esta.

Otro ejemplo de error:

Prelude> [* 3]

<interactive>:1:2:
    A section must be enclosed in parentheses thus: (* 3)

16voto

hammar Puntos 89293

Debido a la máxima munch regla, LT.. obtiene interpreta como el nombre completo de la (.) operador LT módulo. Puesto que usted puede definir sus propios operadores en Haskell, el lenguaje le permite calificar los nombres de los operadores de la misma manera como usted puede con funciones.

Esto conduce a una ambigüedad con la .. utilizado en los rangos cuando el nombre del operador comienza con ., que se resuelve mediante el uso de la máxima munch regla, que dice que la coincidencia más larga gana.

Por ejemplo, Prelude.. es el nombre completo de la función de la composición del operador.

> :info Prelude..
(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in GHC.Base
infixr 9 .
> (+3) Prelude.. (*2) $ 42
87

La razón por la [1..3] o [x..y] funciona, es porque el nombre de un módulo debe comenzar con una letra mayúscula, por lo 1.. y x.. no puede ser calificada de los nombres.

3voto

Dan Burton Puntos 26639

No se pudo cargar la interfaz para `LT':

Kenny y Hammar han explicado lo que esto significa: LT.. que supone ser la . función en el LT módulo. Ya que no hay LT módulo, su intérprete, naturalmente, no se puede cargar.

Una sección debe estar entre paréntesis así: (LT.. GT)

A lo largo de la misma línea, suponiendo que LT.. es una referencia a la . función en el LT módulo, su intérprete es, aparentemente, suponiendo que usted cometió el error de usar corchetes en lugar de paréntesis en orden a una "sección" ( una sección es, por ejemplo, (+1) ).

Esto es simplemente una desagradable pequeña verruga en el lenguaje Haskell; sólo recuerde que el uso de los espacios.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X