Haskell中使用无穷列表的勾股三元组

Haskell中使用无穷列表的勾股三元组,haskell,Haskell,我想在Haskell中使用无穷列表生成毕达哥拉斯三元组。我的代码有什么问题: trojkaty = [(a,b,c) | a <- [1..], b <- [1..], c <- [1..], (a^2)+(b^2)==(c^2)] trojkaty=[(a,b,c)| a这将在尝试a=1和b=1之前尝试无限多个c值 另一种可能性是强制执行c>=a>=b: [(a,b,c) | c <- [1..], a <- [1..c], b <- [1..a], (

我想在Haskell中使用无穷列表生成毕达哥拉斯三元组。我的代码有什么问题:

trojkaty = [(a,b,c) | a <- [1..], b <- [1..], c <- [1..], (a^2)+(b^2)==(c^2)]

trojkaty=[(a,b,c)| a这将在尝试
a=1
b=1
之前尝试无限多个
c

另一种可能性是强制执行
c>=a>=b

 [(a,b,c) | c <- [1..], a <- [1..c], b <- [1..a], (a^2)+(b^2)==(c^2)]

[(a,b,c)| c试着用
c
的中间值来表示
a
b
的上限,否则它将在检查最后一个条件之前强制执行所有无限值列表

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
trojkaty::[(Int,Int,Int)] trojkaty=[(a,b,c)| c为了完整性,另一种可能性是使用所谓的“对角单子”,它以不同的顺序尝试各种可能性。有几个库可以做到这一点

(但对于你想做的事情,公认的答案可能更简单/更容易。)

只是为了好玩:

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),...

这需要软件包。

FYI,不是最有效的代码哦,你可以用
universe
做得更好!复制
Rational
实例中的大部分逻辑来产生互质自然,使用欧几里德定理来获得所有原始的勾股三元组,然后你只需要将乘积与universe结合起来这几乎肯定要快得多,但它也不那么简洁,也不太明显正确,这可能是初学者值得注意的特点!