http://projecteuler.net/index.php?section=problems&id=32
yieldを使うと何でも簡単に書けます。値を束縛できないところが問題ですが。
let rec digits n = if n = 0 then [] else (digits (n / 10)) @ [n % 10] let rec pow n e = if e = 0 then 1 else n * (pow n (e - 1)) let is_pandigital a b c = let flag = List.fold (fun x y -> x ||| (1 <<< y)) 0 ((digits a) @ (digits b) @ (digits c)) flag = 1022 let s = seq { for k in 1..2 do for m in pow 10 (k - 1)..(pow 10 k) - 1 do for n in pow 10 (4 - k)..((pow 10 4) - 1) / m do if is_pandigital m n (m * n) then yield m * n } printfn "%d" (Set.fold (fun x y -> x + y) 0 (Set.ofSeq s))