You need a 'min_str', min_str_i' and 'min_num' to really cover all bases.You can get most of the way there with multimethods. Which, fortunately, Perl 6 has:
multi max (Str *@candidates) { reduce {$^a gt $^b ?? $^a :: $^b} @candidates; } multi max (Num *@candidates) { reduce {$^a > $^b ?? $^a :: $^b} @candidates; }
However, I suspect that won't be sufficiently Lazy for Perl 6. So my preference is for a max function that selects what kind of comparison to do, based on call context:
And to get all the way there (i.e. to allow for user-specified comparisons such as case-insensitive), max would have an optional closure argument (just as sort does now) so that the comparator could be explicitly specified:sub max (*@args) { if want~~Str { reduce {$^a gt $^b ?? $^a :: $^b} @args } else { reduce {$^a > $^b ?? $^a :: $^b} @args } } $biggest_str = ~max @values; # Str context, so use gt $biggest_num = +max @values; # Num context, so use > $biggest_num = max @values; # scalar context, default to >
# Let call context decide... multi max (*@args) { if want~~Str { reduce {$^a gt $^b ?? $^a :: $^b} @args } else { reduce {$^a > $^b ?? $^a :: $^b} @args } } # Let the user specify... multi max (&compare, *@args) { reduce {compare($^a,$^b)>=0 ?? $^a :: $^b} @args; } $biggest_str = ~max @values; $biggest_num = +max @values; $biggest_num = max @values; $biggest_mag = max {abs $^a <=> abs $^b} @values; $biggest_lookup = max {%hash{$^a} cmp %hash{$^b} @values;
In reply to Re: Re: Re: A set of new operators. In keeping with the design of Perl?
by TheDamian
in thread A set of new operators. In keeping with the design of Perl?
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |