【问题标题】:Euler Problem in Haskell -- Can Someone Spot My ErrorHaskell 中的欧拉问题——有人能发现我的错误吗
【发布时间】: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


【解决方案1】:

我认为您需要将“True”和“False”大写。我手边没有 Haskell 解释器,但您可能只是将新变量“true”声明为等于“pal”

【讨论】:

  • 那行得通。谢谢! (我知道它是那样的小东西,但是哇,我觉得我的大脑只是缩小了两个大小......)
【解决方案2】:

难道在 findPal 中,您应该写 TrueFalse 而不是 truefalse

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2020-10-28
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多