Finding Largest Integer Palindrome within a Set
First, since * is commutative, you can save 1/2 of your computation if you restrict yourself to cases where x &gt;= y:

[ x*y | x&lt;-[100..999], y&lt;-[100..x], ... ]


Second, if you could generate all the products in a non-increasing list, you'd just be searching for the first element of such a list satisfying the predicate, which would also speed the search very much. See data-ordlist package, which implements many useful functions on sorted lists, in particular in your case you'll probably need unionBy or unionAllBy