リスト内包表記で書きました

ダブル完全数です。この前はリスト内包表記のことをすっかり忘れていましたが、今回は覚えていましたよ。

main = do print $ [x | x <- [1..10000], (x * 2) == sumOfAliquots(x)]

sumOfAliquots :: Int -> Int
sumOfAliquots n = sum $ aliquots n
  where
    aliquots :: Int -> [Int]
    aliquots n = filter (\x -> (n `mod` x) == 0) [1..(n `div` 2)]

これでも動きますが、参考にするならanekosさんの投稿の方が良いかも。