【发布时间】:2009-11-18 20:02:13
【问题描述】:
我正在 Haskell 的 Euler Problem 4 尝试我的手。它要求由两个三位数相乘形成的最大回文数。问题很简单,我认为我的 Haskell-fu 可以胜任这项任务,但我得到的结果至少可以说是不一致的。
这是我的回文检测器(代码本身很简单):
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
换句话说,在 findPal 的 case 语句中,对 isPalindrome 的调用总是评估为 true,即使它应该为 false。
我在这里没有看到什么?
【问题讨论】:
-
您没有收到“警告:模式匹配重叠”吗?
-
是的,我做到了。我只是不完全确定这意味着什么。回想起来,这很明显。
标签: haskell