毕达哥拉斯使用无穷大列表在Haskell中三倍

时间:2014-01-19 18:11:33

标签: haskell

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

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

4 个答案:

答案 0 :(得分:5)

尝试根据a的中间值表示bc的上限,否则在检查最后一个条件之前它会强制所有无限值列表。

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)

ca=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”,它以不同的顺序尝试可能性。有几个库可以做到这一点。

(但是对于你想要做的事情,接受的答案可能更简单/更容易。)