2011-01-31 17 views
9

Para fines de aprendizaje, intento escribir mi propia implementación de la función zipWith. Sin embargo, estoy abordando un problema con la coincidencia de patrones en casos extremos con _. Primero describiré el buen caso, luego el caso malo. Con suerte, alguien podrá explicar por qué se comportan de manera diferente. Gracias'Múltiples declaraciones de' error al hacer coincidir patrones con el comodín

Si escribo la función zipWith de la siguiente manera, funciona (Tenga en cuenta el orden de los casos extremos que emparejan lista vacía en las líneas 2 & 3): -

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c] 
zipwith' _ [] _ = [] 
zipWith' _ _ [] = [] 
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys 

Compilar en GHCi: -

ghci> :l ZipWith.hs 
[1 of 1] Compiling Main    (ZipWith.hs, interpreted) 

Ok, lo anterior es muy bien, sin embargo, si I intercambiar la coincidencia de patrones para los casos de borde alrededor de GHCi tiros 'múltiples declaraciones de' error para las líneas 2 y 4.

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c] 
zipWith' _ _ [] = [] 
zipwith' _ [] _ = [] 
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys 

Compilar en GHCi: -

ZipWith.hs:4:0: 
    Multiple declarations of `Main.zipWith'' 
    Declared at: ZipWith.hs:2:0 
       ZipWith.hs:4:0 
Failed, modules loaded: none. 

estoy perplejo ...

  1. En cuanto a los patrones en las líneas 2 y 4 parecen mutuamente excluyentes, pero obviamente estoy perdiendo algo fundamental aquí
  2. ¿Por qué cambiar los patrones en las líneas 2 y 3 hace que el error de compilación desaparezca?

Respuesta

15

mensaje El error no se queja de la superposición de patrones (sus patrones se superponen en el caso de dos listas vacías, pero que no es ni el problema, ni un problema), sino múltiples definiciones de la función zipWith.

La razón de ello es que en el segundo caso tiene una definición de zipWith seguida de una definición sin relación de zipwith (nótese la minúscula w), seguido por una nueva definición, conflictiva de zipWith. En otras palabras, es un simple error tipográfico. (Tardé un poco en ver - un error bastante astuto)

+2

Oh, hombre ese error es tan vergonzoso de mi parte, gracias por detectarlo y también explicarme sobre mi interpretación incorrecta del error. – Jabbslad

+4

+1 tanto para Q como para A. Alguien seguramente buscará esto en Google y quiere ver esta respuesta. –

+1

Realmente deberían agregar algo así como "posiblemente error tipográfico" al mensaje de error. – fuz

Cuestiones relacionadas