17 lines
629 B
D
17 lines
629 B
D
// Haskell definition:
|
|
// foldr f z [] = z
|
|
// foldr f z (x:xs) = x `f` foldr f z xs
|
|
S foldr(T, S)(S function(T, S) f, S z, T[] rest) {
|
|
return (rest.length == 0) ? z : f(rest[0], foldr(f, z, rest[1..$]));
|
|
}
|
|
|
|
// Haskell definition:
|
|
//powerSet = foldr (\x acc -> acc ++ map (x:) acc) [[]]
|
|
T[][] powerset(T)(T[] set) {
|
|
import std.algorithm;
|
|
import std.array;
|
|
// Note: The types before x and acc aren't needed, so this could be made even more concise, but I think it helps
|
|
// to make the algorithm slightly clearer.
|
|
return foldr( (T x, T[][] acc) => acc ~ acc.map!(accx => x ~ accx).array , [[]], set );
|
|
}
|