2014-01-19 9 views
6

無限リストを使ってハスケルでピタゴラスのトリプルを生成したい。私のコードで何が問題になっています:無限リストを使ったHaskellのピタゴラスのトリプル

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

最も効率的なコードではありません[線形代数を使用](http://en.wikipedia.org/wiki/Tree_of_primitive_Pythagorean_triples) –

答えて

5

cの中間値でabため上限を発現してみてください:

1つの代替の可能性は、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 
+0

これは機能します!ありがとう! – Krzysiek

2

それもb=2を試みる前に、これはa=1b=1ためcの無限に多くの値をしようとします。それ以外の場合は前に無限のすべての値リスト全体を強制する、

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

の可能性は、異なる順序で可能性を試みる、いわゆる「対角線モナド」を使用することです。そこには、これを行うためのライブラリがいくつかあります。

(しかし、あなたが何をしようとしてために、受け入れ答えは、おそらく簡単に/非常に簡単です。)

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パッケージが必要です。