cor*_*ium 2 haskell arguments list-comprehension list diagonal
列表理解haskell
paar = [(a,b) | a<-[a | a<-[1..], mod a 3 == 0], b<-[b*b | b<-[1..]]]
Run Code Online (Sandbox Code Playgroud)
a =除数3 b =平方
元素必须通过公平的顺序构建.
测试> elem(9,9801)必须为True
我的错误
主要> elem(9,9801)测试
错误 - 垃圾收集无法回收足够的空间
如何用Cantor的对角线参数实现这一点?
谢谢
不太清楚你的目标是什么,但这就是你的代码爆炸的原因.
Prelude> let paar = [(a,b) | a<-[a | a<-[1..], mod a 3 == 0], b<-[b*b | b<-[1..]]]
Prelude> take 10 paar
[(3,1),(3,4),(3,9),(3,16),(3,25),(3,36),(3,49),(3,64),(3,81),(3,100)]
Run Code Online (Sandbox Code Playgroud)
请注意,您(3, ?)在任何其他对之前生成所有对.该elem功能通过从头开始线性搜索此列表来工作.因为有无数(3, ?)对,你永远不会达到(9, ?)那些.
此外,您的代码可能会保留在paar某个位置,以防止它被垃圾回收.这elem (9, 9801) paar不仅会带来无限时间,还会带来无限空间,从而导致您所描述的崩溃.
最终,您可能需要采取另一种方法来解决您的问题.例如,像这样:
elemPaar :: (Integer, Integer) -> Bool
elemPaar (a, b) = mod a 3 == 0 && isSquare b
where isSquare = ...
Run Code Online (Sandbox Code Playgroud)
或者,或者通过无限列表找出一些其他搜索策略,而不是直线搜索.