[Python-ideas] Pattern Matching Syntax

Steven D'Aprano steve at pearwood.info
Thu May 3 14:40:02 EDT 2018


On Fri, May 04, 2018 at 04:01:55AM +1000, Chris Angelico wrote:
> On Fri, May 4, 2018 at 3:18 AM, Ed Kellett <e+python-ideas at kellett.im> wrote:

> > def hyperop(n, a, b):
> >     return match (n, a, b):
> >         (0, _, b) => b + 1
> >         (1, a, 0) => a
> >         (2, _, 0) => 0
> >         (_, _, 0) => 1
> >         (n, a, b) => hyperop(n-1, a, hyperop(n, a, b-1))
> >
> > versus:
> >
> > def hyperop(n, a, b):
> >     if n == 0:
> >         return b + 1
> >     if n == 1 and b == 0:
> >         return a
> >     if n == 2 and b == 0:
> >         return 0
> >     if b == 0:
> >         return 1
> >     return hyperop(n-1, a, hyperop(n, a, b-1))
> 
> I have no idea what this is actually doing

It is the Hyperoperation function.

https://en.wikipedia.org/wiki/Hyperoperation

n is the parameter that specifies the "level" of the operation, and a, b 
are the arguments to the operation.

hyperop(0, a, b) returns the successor of b (a is ignored) -- e.g. the 
successor of 1 is 2, the successor of 2 is 3, etc.

hyperop(1, a, b) returns a+b (addition, or repeated successor);

hyperop(2, a, b) returns a*b (multiplication, or repeated addition);

hyperop(3, a, b) returns a**b, or a^b in the more usual mathematical 
notation (exponentiation, or repeated multiplication);

hyperop(4, a, b) returns a^^b (tetration: repeated exponentiation; e.g. 
3^^4 = 3^3^3^3 = 3^3^27 = 3^7625597484987 = a moderately large number);

hyperop(5, a, b) returns a^^^b (pentation: repeated tetration, and if 
you thought 3^^4 was big, it's nothing compared to 3^^^4);

and so forth. While this is really useful to mathematicians, in 
practice we're going to run out of memory before being able to calculate 
any of the larger values. If we converted the *entire universe* into 
memory, we'd still run out. So while it's a fascinating example for 
maths geeks, in practical terms we might as well re-write it as:

def hyperop(n, a, b):
    raise MemoryError("you've got to be kidding")

which aside from a few values close to zero, is nearly always the right 
thing to do :-)


-- 
Steve


More information about the Python-ideas mailing list