views:

224

answers:

2

Hi all,

I'm trying my hand at Euler Problem 4 in Haskell. It asks for that largest palindrome formed by multiplying two three-digit numbers. The problem was simple enough, and I thought my Haskell-fu was up to the task, but I'm getting a result that looks inconsistent to say the least.

Here's my palindrome detector (which was simplicity itself to code):

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

From here it's a simple question of writing a function to detect when a product forms a palindrome (and possibly to subtract one from one of the multiplicands and recurse over a brute-force search if it doesn't). Here's my very simplified version of this, stripped down and returning an IO action for debugging:

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"

Here are two separate outputs in GHCi:

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

In other words, the call to isPalindrome is always evaluating to true in findPal's case statement, even when it should be false.

What am I not seeing here?

+11  A: 

I think you need to capitalize "True" and "False." I don't have a Haskell interpreter handy but you are probably just declaring a new variable "true" to be equal to "pal"

Steven Huwig
That worked. Thank you! (I knew it was something small like that, but wow, I feel like my brain just shrank two sizes...)
rtperson
I only knew it because I've done it myself too. ;)
Steven Huwig
+3  A: 

Could it be that in findPal, you should write True and False instead of true and false?

EDIT: Ok, thoroughly beaten by the early bird here...

Tom Bartel