无限制列表的elem功能

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的对角线参数实现这一点?

谢谢

ham*_*mar 7

不太清楚你的目标是什么,但这就是你的代码爆炸的原因.

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)

或者,或者通过无限列表找出一些其他搜索策略,而不是直线搜索.