Haskell中的Euler问题 - 有人能发现我的错误

时间:2009-11-18 20:02:14

标签: haskell

我正在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

换句话说,对isPalindrome的调用总是在findPal的case语句中求值为true,即使它应该为false。

我在这里看不到什么?

2 个答案:

答案 0 :(得分:13)

我认为你需要将“真实”和“虚假”大写。我没有方便的Haskell解释器,但你可能只是声明一个新变量“true”等于“pal”

答案 1 :(得分:6)

是不是在findPal中,你应该写TrueFalse而不是truefalse

编辑:好的,在这里被早起的鸟彻底殴打......