Tuple patterns are very simple. They are written using syntax essentially identical to those of tuple expressions: A comma-separated list of pattern elements wrapped in parentheses:
linux$ cat my-script #!/usr/bin/mythryl case (1,2) (1,1) => print "(1,1).\n"; (1,2) => print "(1,2).\n"; (2,1) => print "(2,1).\n"; (2,2) => print "(2,2).\n"; _ => print "Dunno.\n"; esac; linux$ ./my-script (1,2).
What makes pattern-matching really useful is that we may use variables in patterns to extract values from the input expression:
linux$ cat my-script #!/usr/bin/mythryl case (1,2) (i,j) => printf "(%d,%d).\n" i j; esac; linux$ ./my-script (1,2).
Another useful property is that patterns may be arbitrarily nested:
linux$ cat my-script #!/usr/bin/mythryl case (((1,2),(3,4,5)),(6,7)) (((a,b),(c,d,e)),(f,g)) => printf "(((%d,%d),(%d,%d,%d)),(%d,%d))\n" a b c d e f g; esac; linux$ ./my-script (((1,2),(3,4,5)),(6,7))
Note how much more compact and readable the above code is than the equivalent code explicitly extracting the required values using the underlying #1 #2 #3 ... operators:
linux$ cat my-script #!/usr/bin/mythryl x = (((1,2),(3,4,5)),(6,7)); printf "(((%d,%d),(%d,%d,%d)),(%d,%d))\n" (#1 (#1 (#1 x))) (#2 (#1 (#1 x))) (#1 (#2 (#1 x))) (#2 (#2 (#1 x))) (#3 (#2 (#1 x))) (#1 (#2 x)) (#2 (#2 x)); linux$ ./my-script (((1,2),(3,4,5)),(6,7))
Using a case expression to matching a tuple of Boolean values is often shorter and clearer than writing out the equivalent set of nested if statements:
linux$ cat my-script #!/usr/bin/mythryl bool1 = TRUE; bool2 = FALSE; case (bool1, bool2) (TRUE, TRUE ) => print "Exclusive-OR is FALSE.\n"; (TRUE, FALSE) => print "Exclusive-OR is TRUE.\n"; (FALSE, TRUE ) => print "Exclusive-OR is TRUE.\n"; (FALSE, FALSE) => print "Exclusive-OR is FALSE.\n"; esac; linux$ ./my-script Exclusive-OR is TRUE.
Compare with the nested-if alternative:
linux$ cat my-script #!/usr/bin/mythryl bool1 = TRUE; bool2 = FALSE; if bool1 if bool2 print "Exclusive-OR is FALSE.\n"; else print "Exclusive-OR is TRUE.\n"; fi; else if bool2 print "Exclusive-OR is TRUE.\n"; else print "Exclusive-OR is FALSE.\n"; fi; fi; linux$ ./my-script Exclusive-OR is TRUE.
The latter code is both longer and harder to understand and maintain than the former code.