let powerset l = let s = ((l |> List.length) |> pown 2) - 1 [0..s] |> List.map (fun i -> l |> List.mapi (fun a b -> if (pown 2 a) &&& i <> 0 then Some(b) else None) |> List.choose id) // powerset [1;2;3] = [[]; [1]; [2]; [1; 2]; [3]; [1; 3]; [2; 3]; [1; 2; 3]]