tutorial recursive functions else argument haskell syntax whitespace indentation

recursive - map haskell



¿Por qué no debo mezclar pestañas y espacios? (1)

El problema es doble. En primer lugar, Haskell es sensible a la sangría, por ejemplo, el siguiente código no es válido:

example = (a, b) where a = "Hello" b = "World"

Ambos enlaces deben sangrarse con el mismo número de espacios / pestañas (ver la regla de fuera de juego ). Si bien es obvio en este caso, está bastante oculto en el siguiente, donde denoto un espacio con · y una pestaña con » :

example = (a, b) ··where ····a = "Hello" » b = "World"

Esto se verá como un código válido de Haskell si el editor mostrará pestañas alineadas a múltiplos por cuatro. Pero no lo es. Las pestañas de Haskell están alineadas por múltiplos de ocho, por lo que el código se interpretará así:

example = (a, b) ··where ····a = "Hello" » b = "World"

En segundo lugar, si usa solo pestañas, puede terminar con un diseño que no se ve bien. Por ejemplo, el siguiente código parece correcto si se muestra una pestaña con seis o más espacios (ocho en este caso):

example = (a, b) » where» a = "Hello" » » b = "World"

Pero en otro editor que usa 4 espacios ya no se verá bien:

example = (a, b) » where» a = "Hello" » » b = "World"

Sin embargo, sigue siendo correcto. Sin embargo, alguien que esté acostumbrado a los espacios podría reindentarse con enlaces y terminar con un error de analizador.

Si aplica una convención de código en todo el código que se asegura de que solo use pestañas al comienzo de una línea y use una nueva línea después de where , let o do , puede evitar algunos de los problemas (consulte 11 ). Sin embargo, las versiones actuales de GHC advierten sobre las pestañas de forma predeterminada , ya que have been a source of many errores de análisis en el pasado, por lo que probablemente también desee deshacerse de ellos.

Ver también

A menudo leo que no debería mezclar pestañas y espacios en Haskell, o que no debería usar pestañas en absoluto. ¿Por qué?