haskell - 列表推导式的奇怪行为

标签 haskell functional-programming list-comprehension higher-order-functions

我正在学习 Haskell 的基础知识,并试图解决 Euler 项目的简单任务:找到 3 位数字的最大回文数 (100.999)。我写了这段代码:

palindrome = maximum $ filter (\a -> reverse a == a) $
                                    map show [ x*y :: Int | x <- [100 .. 999],
                                                            y <- [x, x+1 .. 999]]

当我将其更改为 x <- [307 .. 999] 时,它给出了错误的答案 = 99999答案仍然是错误的:94249(所有回文,但不是最大的)最后当我把它改成 x <- [308 .. 999],它给了我正确的答案:906609。

我真的不明白这种行为:似乎在生成的列表中发生了某种溢出和截断。有人可以向我解释这种错误的行为吗?我不想你来回答任务:我知道我的解决方案效率不高。我只是想让你解释一下这个代码行为(列表截断或内存问题)。谢谢。

最佳答案

filter的结果是 String 的列表值,所以 maximum正在按字典顺序比较它们。您需要将值转换回 Int首先。类型签名确保 read返回正确类型的值。

palindrome :: Int
palindrome = maximum . map read . filter ...

另一种方法是仅将值转换为 String在过滤器本身中:
palindrome :: Int
palindrome = maximum $ filter (\a -> let sa = show a in reverse sa == sa) [ x*y | x <- [100..999], y <- [x..999]]

关于haskell - 列表推导式的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534058/

相关文章:

haskell - 如何在haskell中调用函数并返回不同的值? (无单子(monad))

haskell "libraries"

docker - 使用 docker : true 时获取堆栈以获取 GHCJS 内置 docker 图像

Haskell 复杂函数组合

java - 将函数引用作为参数传递

python - `[b for a in x for b in a if not b==k]` 是什么意思?

haskell - 案例表达式/列表推导中的模式匹配

haskell - Yesod 可编辑表

python:将元素插入到元组列表内的元组中

python - 任意嵌套列表的过滤函数