Optimized list filtering on implementation of Project Euler 23
Add type signatures. Without type signatures, your integral types will default to Integer. So let us add type signatures:

projectEuler23 :: Int
projectEuler23 =
  let a = abundantNums 28124 in
  sum [x | x &lt;- [1..28124], not $ isSumAbundant x a]

isSumAbundant :: Int -&gt; [Int] -&gt; Bool
isSumAbundant n a =
  any (\x -&gt; (n - x) `elem` a) (takeWhile (&lt;n) a)

abundantNums :: Int -&gt; [Int]
abundantNums n =
  [x | x &lt;- [1..n], (&gt;x) $ sum $ properDivisors x]

properDivisors :: Int -&gt; [Int]
properDivisors n =
  let  limit = (floor.sqrt.fromIntegral) n in
  [limit | limit^2 == n]
  ++ ((1:) $ concat [ [x, div n x] | x &lt;- [2..limit - 1], rem n x == 0])


Note that a type signature on projectEuler23 would have been enough. Operations on Int are usually faster than Integer.

In isSumAbundant you can stop at n`div`2, e.g.

isSumAbundant n a = any (\x -&gt; (n - x) `elem` a) $ takeWhile (&lt;= (n `div` 2)) a


Similar in abundantNums, you can use scanl1:

abundantNums n =
  [x | x &lt;- [1..n], any (x &lt;) $ scanr1 (+) $ properDivisors x]


This models your "break" from imperative languages.