我想使用无穷大列表在Haskell中生成毕达哥拉斯三元组。我的代码出了什么问题:
trojkaty = [(a,b,c) | a <- [1..], b <- [1..], c <- [1..], (a^2)+(b^2)==(c^2)]
答案 0 :(得分:5)
尝试根据a
的中间值表示b
和c
的上限,否则在检查最后一个条件之前它会强制所有无限值列表。
trojkaty :: [(Int, Int, Int)]
trojkaty = [(a,b,c) | c <- [2..], b <- [2..c-1], a <- [2..b-1], a^2 + b^2 == c^2]
main = do
print $ take 5 trojkaty
答案 1 :(得分:2)
在c
和a=1
尝试b=1
之前,这会为b=2
尝试无限多的值。
另一种可能性是强制执行c >= a >= b
:
[(a,b,c) | c <- [1..], a <- [1..c], b <- [1..a], (a^2)+(b^2)==(c^2)]
答案 2 :(得分:2)
只是为了好玩:
Prelude Data.Universe> filter (\(a, b, c) -> a^2+b^2 == c^2 && all (>0) [a,b,c]) universe
[(3,4,5),(4,3,5),(6,8,10),(8,6,10),(5,12,13),(12,5,13),(9,12,15),(12,9,15),...
这需要universe包。
答案 3 :(得分:0)
为了完整性,其他的可能性是使用所谓的“对角线monad”,它以不同的顺序尝试可能性。有几个库可以做到这一点。
(但是对于你想要做的事情,接受的答案可能更简单/更容易。)