我正在Haskell的欧拉问题4中尝试.它要求通过乘以两个三位数形成的最大回文.问题很简单,我认为我的Haskell-fu完成了任务,但我得到的结果看起来不一致,至少可以说.
这是我的回文检测器(代码简单本身):
isPalindrome :: String -> Bool
isPalindrome [] = True
isPalindrome str = let str2 = reverse str
in (str2 == str)
Run Code Online (Sandbox Code Playgroud)
从这里开始,这是一个简单的问题,即编写一个函数来检测产品什么时候形成一个回文(并且可能从一个被乘数中减去一个,如果没有,则通过蛮力搜索来递减).这是我非常简化的版本,剥离并返回一个用于调试的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"
Run Code Online (Sandbox Code Playgroud)
以下是GHCi中的两个独立输出:
*Main> isPalindrome $ show (999*999)
False
*Main> findPal 999 999
mult is 998001
Run Code Online (Sandbox Code Playgroud)
换句话说,对isPalindrome的调用总是在findPal的case语句中求值为true,即使它应该为false.
我在这里看不到什么?