raku

How do I “flatten” a list of lists in perl 6?


Let's say I want all permutations of 2 letters out of a, b and c.

I can do:

my @perm = <a b c>.combinations(2)».permutations;
say @perm;
# [((a b) (b a)) ((a c) (c a)) ((b c) (c b))]

which is close, but not exactly what I need. How do I “flatten” this so that I get:

# [(a b) (b a) (a c) (c a) (b c) (c b)]

?


Solution

  • See also "a better way to accomplish what I (OP) wanted".

    See also "Some possible solutions" answer to "How can I completely flatten a Raku list (of lists (of lists) … )" question.

    Add a subscript

    my \perm = <a b c>.combinations(2)».permutations;
    say perm;       # (((a b) (b a)) ((a c) (c a)) ((b c) (c b)))
    say perm[*];    # (((a b) (b a)) ((a c) (c a)) ((b c) (c b)))
    say perm[*;*];  # ((a b) (b a) (a c) (c a) (b c) (c b))
    say perm[*;*;*] # (a b b a a c c a b c c b)
    

    Notes

    I used a non-sigil'd variable because I think it's a bit clearer what's going on for those who don't know Raku.

    I didn't append the subscript to the original expression but I could have:

    my \perm = <a b c>.combinations(2)».permutations[*;*];
    say perm;       # ((a b) (b a) (a c) (c a) (b c) (c b))