我想在我的手在哈斯克爾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。
我在這裏沒有看到什麼?
不要你會得到一個「警告:模式匹配(ES)重疊」? – ephemient 2009-11-19 15:57:37
是的,我做到了。我只是不完全確定它的含義。回想起來,這很明顯。 – rtperson 2009-11-19 17:29:25