I have this function which takes a list as input and computes the powerset.

let rec powerset = function
    | []    -> [[]]
    | x::xs -> List.collect (fun subset -> [subset; x::subset]) (powerset xs)

let ps = powerset [1..3]
val ps: int list list =
[[]; [1]; [2]; [1; 2]; [3]; [1; 3]; [2; 3]; [1; 2; 3]]

Is there a cleaner way to do it? I'm also a little confused by how it actually works. List.collect takes a function and a list and concats the results into a new list, which is then returned. But I have a little trouble following the flow in this case.

Why is the first list empty?

  • 1
    \$\begingroup\$ Is that your code or are you asking for an explanation of someone else's code? \$\endgroup\$ – Martin R Nov 11 '17 at 20:39
  • \$\begingroup\$ It's a function I found and modified slightly when searching for a way to find the powerset. \$\endgroup\$ – Left4Cookies Nov 11 '17 at 20:42
  • \$\begingroup\$ it's seems like not appropriate Q for CR \$\endgroup\$ – user110704 Nov 15 '17 at 15:21

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.