haskell - Haskell 中的欧拉问题——有人能发现我的错误吗

标签 haskell

我正在尝试 Euler Problem 4在 haskell 。它要求通过两个三位数相乘形成最大的回文数。问题很简单,我认为我的 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。

我在这里没有看到什么?

最佳答案

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

关于haskell - Haskell 中的欧拉问题——有人能发现我的错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1758672/

相关文章:

haskell - 多态类型中的包含

haskell - Haskell程序的-hc配置文件中PINNED是什么意思?

haskell - 是否可以使用约束类型在 Haskell 中模拟有限形式的交集类型?

haskell - 如何从这段代码中删除 `case of`?

haskell - 在 Haskell 中写或不写 `module Main where`

haskell - 如何抽象 "back and forth"转换?

haskell - 如何向类型构造函数添加约束

haskell - 从第二个字符串中删除第一个字符串中的所有字符的函数

haskell - 为什么 Haskell NoBuffering 选项似乎仍然可以缓冲?

list - 检查两个列表是否以任意顺序具有相同的元素