Попробуйте с помощью простого рекурсивного генератора:
http://en.wikipedia.org/wiki/Formulas_for_generating_Pythagorean_triples
(новая статья)
http://en.wikipedia.org/wiki/Tree_of_primitive_Pythagorean_triples
РЕДАКТИРОВАТЬ (7Май 2014)
Здесь я создал бесконечный генератор, который может генерировать примитивные триплеты, упорядоченные по периметру (но могут быть изменены, чтобы упорядочить их по другому параметру - гипотенузы, площадь, ...), если он считает, что любойтриплет меньше, чем любой генерируемый из матрицы генератора в соответствии с предоставленной функцией сравнения
import Data.List -- for mmult
merge f x [] = x
merge f [] y = y
merge f (x:xs) (y:ys)
| f x y = x : merge f xs (y:ys)
| otherwise = y : merge f (x:xs) ys
mmult :: Num a => [[a]] -> [[a]] -> [[a]]
mmult a b = [ [ sum $ zipWith (*) ar bc | bc <- (transpose b) ] | ar <- a ]
tpgen_matrix = [[[ 1,-2, 2],[ 2 ,-1, 2],[ 2,-2, 3]],
[[ 1, 2, 2],[ 2 , 1, 2],[ 2, 2, 3]],
[[-1, 2, 2],[-2 , 1, 2],[-2, 2, 3]]]
matrixsum = sum . map sum
tripletsorter x y = ( matrixsum x ) < ( matrixsum y ) -- compare perimeter
triplegen_helper b = foldl1
( merge tripletsorter )
[ h : triplegen_helper h | x <- tpgen_matrix , let h = mmult x b ]
triplets = x : triplegen_helper x where x = [[3],[4],[5]]
main = mapM print $ take 10 triplets