class HyperWhatever { }

HyperWhatever is very similar in functionality to Whatever. The difference lies in HyperWhatever standing in for multiple values, rather than a single one.

Standalone term §

Just like with Whatever, if a HyperWhatever is used as a term on its own, no currying is done and the HyperWhatever object will be used as-is:

sub foo ($arg{ say $arg.^name }
foo **# OUTPUT: «HyperWhatever␤»

You can choose to interpret such a value as standing for multiple values in your own routines. In core, a HyperWhatever can be used with this meaning when smartmatching with Lists:

say (18)                ~~ (1**8); # OUTPUT: «True␤» 
say (1245678~~ (1**8); # OUTPUT: «True␤» 
say (1289)          ~~ (1**8); # OUTPUT: «False␤»

Wherever a HyperWhatever appears in the list on the right-hand side means any number of elements can fill that space in the list being smartmatched.

Currying §

When it comes to currying, the HyperWhatever follows the same rules as Whatever. The only difference is HyperWhatever produces a Callable with a *@ slurpy as a signature:

say (**²)(12345); # OUTPUT: «(1 4 9 16 25)␤»

A HyperWhatever closure can be imagined as a Whatever closure with another sub wrapped around it that simply maps each element in the arguments over:

my &hyper-whatever = sub (*@args{ map *², @args }
say hyper-whatever(12345); # OUTPUT: «(1 4 9 16 25)␤»

When currying, mixing HyperWhatever with Whatever is not permitted.

Type Graph §

Type relations for HyperWhatever
perl6-type-graph HyperWhatever HyperWhatever Any Any HyperWhatever->Any Mu Mu Any->Mu

Expand above chart

Generated from

Generated from Type/HyperWhatever.pod6