Mai*_*r00 4 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]]
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误的答案= 99999,当我改变它以x <- [307 .. 999]回答仍然是错的:94249(所有回文,但不是最大的)最后当我改变它给x <- [308 .. 999],它正确答案:906609.
我真的不明白这种行为:似乎在生成的列表中发生了某种溢出和截断.有人可以解释我这种错误行为吗?我不希望你回答任务:我知道我的解决方案效率不高.我只是想让你解释这个代码行为(列表截断或内存问题).谢谢.
结果filter是一个String值列表,因此按maximum字典顺序比较它们.您需要Int先将值转换回s.类型签名确保read返回正确类型的值.
palindrome :: Int
palindrome = maximum . map read . filter ...
Run Code Online (Sandbox Code Playgroud)
另一种方法是仅String在过滤器本身中将值转换为a :
palindrome :: Int
palindrome = maximum $ filter (\a -> let sa = show a in reverse sa == sa) [ x*y | x <- [100..999], y <- [x..999]]
Run Code Online (Sandbox Code Playgroud)