2011-10-04 12 views
7
test :: String -> String -> Int 

test' x y n = n 
test' "" (y:ys) n = error "error" 
test' (x:xs) "" n = error "error" 
test' (x:xs) (y:ys) n = 
     if  x == y 
     then test' xs ys n 
     else test' xs ys (n+1) 
test a b = test' a b 0 

Quando compilo questo, ottengo questo output:Haskell - Partita di modello (es) si sovrappongono

Warning: Pattern match(es) are overlapped 

E la risposta è sempre "0", che non è quello che intendevo. Qual è il problema con il codice e come risolverlo?

risposta

9

test' x y n = n corrisponderà per ogni chiamata, gli altri motivi non saranno considerati. Penso che questo caso dovrebbe essere test' "" "" n = n. Si ottiene lo stesso risultato se si sposta la linea originale allo fine (quando tutti gli altri casi non vanno a buon fine), ma allora si dovrebbe scrivere test' _ _ n = n che mostra che si ignorano deliberatamente alcuni degli argomenti.

[Edit]

Una soluzione più breve potrebbe essere:

test a b | length a == length b = sum $ map fromEnum $ zipWith (/=) a b 
     | otherwise = error "error" 

Il zipWith espressione genera un elenco di Bool che è True per ogni differenza. La funzione fromEnum mappe False a 0 e True a 1.

+0

Molto utile! Ho imparato molto! Grazie – Ferry

7

Gli schemi vengono provati in ordine. Il primo dei tuoi pattern per test' corrisponde sempre, quindi il caso viene sempre utilizzato. Il primo caso dovrebbe essere probabilmente

test' "" "" n = n 

invece.

Problemi correlati