2017-05-21 5 views
3

Ich versuche, ein Sieb der Erasthosthenes Funktion zu schreiben, die einem Benutzer alle Primzahlen von 2 bis zu seiner oberen Grenze gibt. Also habe ich diesen Code geschrieben:Nicht erschöpfende Muster in der Funktion definiert in GHCi

main = do 
putStrLn "Upper Limit" 
g <- readLn 
let sieve [] = [] 
let sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] 
let primes = sieve [2..g] 
print primes 

Der Code kompiliert und mir die richtige Lösung zu geben, aber ich bin immer diese Ausnahme am Ende der Lösung: *** Ausnahme: Nicht erschöpfende Muster in Funktionssieb Also habe ich überprüft, welche Muster nicht übereinstimmen.

warning: [-Wincomplete-patterns] 
    Pattern match(es) are non-exhaustive 
    In an equation for `sieve': Patterns not matched: (_:_) 

warning: [-Wincomplete-patterns] 
    Pattern match(es) are non-exhaustive 
    In an equation for `sieve': Patterns not matched: [] 

Weicht Ich verstehe nicht, da ich let sieve [] = [] gegeben habe, und ich dachte, _ in Haskell: jede Variable so etwas macht das Muster (:) bedeuten? Jede Hilfe wäre willkommen.

+0

es tut dies tun, wenn Sie sie als Funktionen außerhalb des Haupt schreiben? – Carcigenicate

+0

Mögliches Duplikat von [Nicht vollständiges Muster in Funktion in GHCi] (http://stackoverflow.com/questions/26738392/non-exhaustive-pattern-in-function-in-ghci) – amalloy

Antwort

5

Das Problem ist, dass Sie definieren sieve in zwei separaten let Aussagen. Als Ergebnis der Haskell-Compiler denkt, dass Sie zwei separate sieve Funktionen definieren. Daher fehlt dem ersten sieve ein (_:_) Muster und dem letzteren das [] Muster.

Wenn Sie später sieve verwenden, die Haskell Compiler auf den nächsten ein verbinden wird, so letztere die (als Ergebnis ein Aufruf an sieve) in let primes = sieve [2..g] wird nur der Sekundensieve Definition kennen (und damit Fehler auf das Ende der Liste).

Sie können dieses Problem lösen, indem Sie die folgenden let Anweisung:

let { sieve [] = [] ; sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] } 
+0

Sie können auch beide Teile der Definition einrücken auf dem gleichen Niveau nach "lassen". – Davislor

Verwandte Themen