2011-01-31 5 views
9

Per motivi di apprendimento, sto tentando di scrivere la mia implementazione della funzione zipWith. Tuttavia, sto riscontrando un problema con la corrispondenza dei modelli sui casi limite con _. Per prima cosa descriverò il caso buono, quindi il caso negativo. Spero che qualcuno sia in grado di spiegare perché si comportano diversamente. GrazieErrore di "dichiarazioni multiple di" quando il pattern corrisponde al carattere jolly

Se scrivo la funzione zipWith come segue, funziona (Nota l'ordine dei casi limite corrispondenti elenco vuoto sulle linee 2 & 3): -

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

compilazione in GHCI: -

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

Ok, quanto sopra va bene, ma se mi scambiare il pattern matching per i casi limite intorno GHCI tiri 'più dichiarazioni di' errore per le linee 2 e 4.

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

Compilazione in GHCI: -

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

stumped ...

  1. Guardando i modelli sulle linee 2 e 4 sembrano escludersi a vicenda, ma sto ovviamente manca qualcosa fondamentale qui
  2. Perché la commutazione dei motivi sulle righe 2 e 3 provoca la scomparsa dell'errore di compilazione.

risposta

15

messaggio L'errore non si lamenta sovrapposizione modelli (i vostri modelli si sovrappongono nel caso di due liste vuote, ma questo è né il problema, né un problema), ma più definizioni della funzione zipWith.

La ragione di ciò è che nel vostro secondo caso si ha una definizione di zipWith seguita da una definizione di non collegato di zipwith (notare il minuscolo w), seguita da una nuova definizione in conflitto di zipWith. In altre parole è un semplice refuso. (Mi ci è voluto un po 'di tempo per vedere - un errore di battitura)

+2

Oh uomo che l'errore di battitura è così imbarazzante da parte mia, grazie per averlo individuato e anche per spiegare la mia interpretazione errata dell'errore. – Jabbslad

+4

+1 sia per Q che per A. Qualcuno sarà sicuramente Google e vuole vedere questa risposta. –

+1

Dovrebbero davvero aggiungere qualcosa come "possibilmente errore di battitura" al messaggio di errore. – fuz

Problemi correlati