10000以下の完全数を求める

30分プログラム、その721。10000までの完全数をもとめる(Haskell)にインスパイアされました。
元々は、mixiにあった問題らしいです。

使い方

- perfects 10000;
val it = [0,6,28,496,8128] : int list

ソースコード

fun id x = x;
fun range n = List.tabulate (n,id);

fun isFactor n m = n mod m = 0;

fun factors n = List.filter (isFactor n) (List.tabulate (n div 2,fn n => n + 1));

fun sum xs = List.foldl (op +) 0 xs;

fun isPerfect n = sum (factors n) = n;

fun perfects n = List.filter isPerfect (List.tabulate (n,id));