2009-08-01 3 views
13

En el espíritu de los otros errores comunes en las preguntas, ¿cuáles son los errores más comunes que cometen los programadores Haskell? Me he enseñado a mí mismo Haskell por un tiempo y estoy empezando a sentirme lo suficientemente cómodo con el idioma para comenzar a aplicarlo en el mundo real.Errores comunes de programación para los desarrolladores de Haskell para evitar?

+1

Y otra debería-ser-comunidad-wiki ... – chaos

+0

Este estilo de pregunta generalmente se aprecia mejor como Wiki de la comunidad. – zombat

+0

Es difícil imaginar por qué esto "no es una pregunta real" cuando hay tantas otras preguntas de "errores comunes de programación" en SO que han sobrevivido. –

Respuesta

15

El error más común que conozco es la introducción de una fuga de espacio a través de la evaluación perezosa. Hay muchas maneras de lograr este error, pero uno que especialmente programa a los programadores con otra experiencia de programación funcional es poner un resultado en un parámetro de acumulación, pensando que el parámetro de acumulación tomará un espacio constante. En muchos casos, el parámetro de acumulación requiere espacio lineal porque los parámetros no se evalúan.

Otro error común es olvida que let es siempre recursivo. Una involuntaria

let x = ... x ... 

puede conducir a desconcertante resultados.

La mayoría de las otras malas experiencias comunes se manifiestan no como errores sino como problemas para que los programas superen el comprobador de tipos o para que no comprendan el modelo de E/S monádicas. Las dificultades con la lista de comprensiones y con las anotaciones do ocurren ocasionalmente.

En general las dificultades que tienen los programadores principiantes Haskell incluyen

  • lengua grande con muchos rincones oscuros, especialmente en el sistema de tipos
  • programas problemas para compilar, sobre todo cuando lo hacen de E/S
  • Haciendo todo en el IO mónada
  • gran dificultad para predecir el comportamiento en el tiempo y en el espacio de los programas funcionales perezosos
8

Un error común para comenzando Programadores Haskell es forget the difference between constructor and type namespaces. Ese fue el error de un principiante que me avergüenza tener mi nombre asociado, pero estoy bastante seguro de que otros tropezarán con esa respuesta cuando tengan un problema similar, por lo que también puede mantenerlo ahí.

4

La diferencia entre [] y [[]]: la lista vacía y la lista con 1 elemento, es decir, la lista vacía. Este especialmente aparece en casos base de funciones recursivas.

-1

Utilice funciones recursivas no rectas o pliegues no estrictos que se producen para el desbordamiento de la pila.

+2

Esto es menos cierto en Haskell que en otros lenguajes funcionales. Gran parte del tiempo, la pereza hace que las versiones de funciones que no son de cola sean una mejor opción (por ejemplo, puedes 'foldr' una lista infinita, mientras que el' foldl recursivo 'de cola explotará cada vez). – Chuck

+1

Lo sé, pero head (x: xs) = head xs + 1 no explotará en una lista de 1000000 artículos? – Hai

+0

He intentado 'head '' (x: xs) = let x '= head' 'xs en x' \' seq \ 'x '+ 1', sin éxito. Alguien tiene alguna pista? – ScootyPuff

-1

La noción de una expresión es bastante confusa para los principiantes. Tome la construcción condicional en los lenguajes de programación imperativos. Es solo una construcción, pero en Haskell es una expresión. Por lo tanto, si un condicional debe tener una coincidencia else y ambos deben arrojar valores del mismo tipo de evaluación.

wrongFunc n = if n > 18 
       then 1 
       else False 

El bloque if se evalúa en un entero donde, como el else, devuelve un bool. Este es un error común ya que en Haskell no son solo bloques de enunciados sino expresiones.

+3

No veo por qué es confuso, y soy un poco novato de Haskell. Compare lo mismo en un lenguaje tipo C: tendría devoluciones explícitas, pero el tipo de devolución debería ser int o bool y sería un error devolver 1 o falso según el valor del argumento. – Zak

Cuestiones relacionadas