2009-11-18 23 views
8

我想在我的手在哈斯克爾Euler Problem 4。它要求通過乘以兩個三位數字形成最大的迴文。問題很簡單,我認爲我的Haskell-fu已經完成了任務,但是我得到的結果看起來並不一致,至少可以說。Haskell中的歐拉問題 - 有人可以發現我的錯誤

這裏是我的迴文檢測器(這是很簡單的事代碼):

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

從這裏它是寫一個函數,當一個產品形成迴文(也可能是減去來自一個檢測的一個簡單的問題的被乘數,如果不是,則通過蠻力搜索進行遞歸)。這是我非常簡化版本的這個,剝離下來並返回調試一個IO動作:

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" 

這裏有GHCI兩個獨立的輸出:

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

換句話說,調用isPalindrome總是在findPal的case語句中評估爲true,即使它應該是false。

我在這裏沒有看到什麼?

+0

不要你會得到一個「警告:模式匹配(ES)重疊」? – ephemient 2009-11-19 15:57:37

+0

是的,我做到了。我只是不完全確定它的含義。回想起來,這很明顯。 – rtperson 2009-11-19 17:29:25

回答

13

我認爲你需要大寫「真」和「假」。我沒有一個Haskell解釋方便,但你可能只是聲明瞭一個新變量「真」等於「PAL」

+0

工作。謝謝! (我知道這是小事,但哇,我覺得我的大腦只是縮小了兩種尺寸......) – rtperson 2009-11-18 20:11:20

+0

我只知道它,因爲我也是自己做的。 ;) – 2009-11-19 03:09:54

6

難道說在findPal,你應該寫TrueFalse代替truefalse

編輯:好吧,徹底早起的鳥兒在這裏打...