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

Euler Problem in Haskell — Can Someone Spot My Error

我在尝试哈斯克尔的欧拉问题4。它要求用两个三位数字相乘形成最大的回文。这个问题很简单,我以为我的哈斯凯尔·傅能胜任这项任务,但我得到的结果至少看起来不一致。

这是我的回文检测器(代码本身很简单):

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

从这里开始,这是一个简单的问题,即编写一个函数来检测一个产品何时形成回文(如果不是,还可能从被乘数中减去一个,然后在暴力搜索中重复出现)。这是我的一个非常简化的版本,它简化并返回了一个用于调试的IO操作:

1
2
3
4
5
6
7
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中有两个单独的输出:

1
2
3
4
*Main> isPalindrome $ show (999*999)
False
*Main> findPal 999 999
mult is 998001

换句话说,在findpal的case语句中,对isAlindrome的调用总是评估为true,即使它应该是false。

我在这里没有看到什么?


我认为你需要大写"true"和"false"。我手边没有haskell解释器,但你可能只是声明一个新变量"true"等于"pal"。


在findpal中,你应该写TrueFalse而不是TrueFalse吗?

编辑:好吧,被早起的鸟儿彻底打败了…