2009-11-18 6 views
8

Ich versuche meine Hand bei Euler Problem 4 in Haskell. Es fragt nach dem größten Palindrom, das durch Multiplikation zweier dreistelliger Zahlen entsteht. Das Problem war einfach genug, und ich dachte, dass mein Haskell-fu der Aufgabe gewachsen war, aber ich bekomme ein Ergebnis, das, um es milde auszudrücken, uneinheitlich aussieht.Euler-Problem in Haskell - Kann jemand meinen Fehler finden

Hier ist mein Palindrom Detektor (die Einfachheit selbst Code war):

isPalindrome :: String -> Bool 
isPalindrome [] = True 
isPalindrome str = let str2 = reverse str 
        in (str2 == str) 

Von hier aus ist es eine einfache Frage eine Funktion des Schreibens zu erkennen, wenn ein Produkt mit einem Palindrom bildet (und möglicherweise einen von einem subtrahieren der Multiplikanden und recurse über eine Brute-Force-Suche, wenn dies nicht der Fall ist). Hier ist meine sehr vereinfachte Version davon, abgespeckte und Zurücksenden eine IO Aktion für die Fehlersuche:

findPal :: Integer -> Integer -> IO() 
findPal 1 y = putStrLn "reached 1" 
findPal x y = let pal = isPalindrome $ show mult 
        mult = x * y 
        in case pal of 
          true -> putStrLn $ "mult is " ++ (show mult) 
          false -> putStrLn "pal is false" 

Hier sind zwei separate Ausgänge in GHCi:

*Main> isPalindrome $ show (999*999) 
False 
*Main> findPal 999 999 
mult is 998001 

Mit anderen Worten, ist der Aufruf von isPalindrome immer in findPal's case-Anweisung zu true auswerten, auch wenn es falsch sein sollte.

Was sehe ich hier nicht?

+0

Haben Sie keine bekommen? – ephemient

+0

Ja, tat ich. Ich war mir nicht ganz sicher, was es bedeutete. Im Nachhinein ist es offensichtlich. – rtperson

Antwort

13

Ich denke, Sie müssen "True" und "False" groß schreiben. Ich habe nicht einen Haskell-Interpreter praktisch, aber Sie werden wahrscheinlich nur eine neue Variable „true“ zu erklären, dass er gleich „pal“

+0

Das hat funktioniert. Vielen Dank! (Ich wusste, dass es so klein war, aber wow, ich habe das Gefühl, dass mein Gehirn gerade zwei Größen schrumpfte ...) – rtperson

+0

Ich wusste es nur, weil ich es auch selbst gemacht habe. ;) –

6

Könnte es in findPal sein, sollten Sie True und False statt true schreiben und false ?

EDIT: ": Pattern Match (es) überlappte Warnung" Ok, gründlich von dem frühen Vogel geschlagen hier ...

Verwandte Themen