我编写了以下函数,它根据毕达哥拉斯三元组的定义返回一个无限的三元组成员列表 (a, b, c):a^2 + b^2 = c^2。我需要能够检查给定的元组 (a, b, c) 是否是有效的毕达哥拉斯三元组。我这样做的方法是通过函数生成一个无限的元组列表,然后我将此列表elem
与我要检查的 3 元组一起传递给。
但是,当它将我的 3 元组与无限列表的成员匹配时,这不会终止。
代码:
pythagoreanTriples::[(Integer, Integer, Integer)]
pythagoreanTriples = [(a, b, c) | a <- [2..], b <- [a+1..],
c <- [b+1..], a*a + b*b == c*c ]
main = do
print $ elem (30, 72, 78) (pythagoreanTriples)
我知道逻辑是正确的,因为我尝试修改上述函数以生成有限列表,并且逻辑运行得非常好:
pythagoreanTriples n = [(a, b, c) | a <- [2..n], b <- [a+1..n],
c <- [b+1..n], a*a + b*b == c*c ]
main = do
print $ elem (30, 72, 78) (pythagoreanTriples 100)
但是,必须使用无限列表来完成。请向我建议如何使它工作。谢谢。