Quick Tip #8: Perl 6 sets

Perl 6 has proper sets and set-like types, along operators to do proper set operations.

  • Set – a collection of unique thingys
  • Bag – a collection of unique thingys, but weighted for the count of the number of times something is put the bag
  • Mix – a bag that allows fractional weights

These are immutable types. Once you make them, that’s it. Each has a *Hash version that allows you to change the members, but I’ll ignore those.

$ perl6
> my $set = set( 1, 2, 3, 4 )
set(4, 3, 1, 2)
> 4 ∈ $set                      # member of
True
> 5 ∈ $set                      # member of
False
> 5 ∉ $set                      # not member of
True
> set( 2, 3 ) ⊆ $set            # subset of
True
> set( 2, 6 ) ⊆ $set            # subset of
False

A set is a more natural way to see if a value exists in a list of values. You might each for a hash and use :exists to check for the key, but a set will do that (even though that’s what
Perl 6 sets are doing for you behind the scenes for now):

my $set  = set( <a b c d> );
my $item = 'h';
say "$item is in set" if $item ∈ $set;

Perl 6 has the operators to turn two lists into a set:

$ perl6
> ( 1, 2, 3 ) ∪ ( 4, 5 )        # union
set(5, 4, 3, 1, 2)
> ( 1, 2, 4 ) ∩ ( 1,  2, 3 )    # intersection
set(1, 2)
> ( 1, 2, 4 ) ∖ ( 1, 2, 3 )     # difference
set(4)
> ( 1, 2, 4 ) ⊖ ( 1, 2, 3 )     # symmetric difference
set(4, 3)

So far I’ve used the fancy Unicode characters that you’d see in set math, but each of these have Texas (ASCII) versions too:

Texas Fancy Codepoint (hex) Operation
(elem) U+2208 member of, $a ∈ $set or $a (elem) $set
!(elem) U+2209 not a member of, $a ∉ $set or $a !(elem) $set
(cont) U+220B contains,
!(cont) U+220C does not contain
(<=) U+2286 subset of or equal to,
!(<=) U+2288 not subset of nor equal to,
(<) U+2282 subset of
!(<) U+2284 not subset of
(>=) U+2287 superset of or equal to,
!(>=) U+2289 not superset of nor equal to,
(>) U+2283 superset of
!(>) U+2285 not superset of
(>+) U+227C baggy superset
!(>+) U+227D not baggy superset

There are operators that return sets from two lists:

Texas Fancy Codepoint (hex) Operation
(|) U+222A union
(&) U+2229 intersection
(-) U+2216 difference
(^) U+2296 symmetric difference
(.) U+228D baggy multiplication
(+) U+228E baggy addition

Leave a Reply

Your email address will not be published. Required fields are marked *