Pattern matching onList

Pattern matching onListelements has its own special syntax. Thedocumentation forListgoes in-depth about the data structure itself, check it out!

Head and tail pattern matching

You can use pattern matching to scrutinize the first (left-most) element of a list with the+:syntax.

match ["a", "b", "c"] with head +: tail -> head _ -> "empty list"
"a"

The+:is unpacking the first elementheadto its text value"a"while keeping the remaining elementstailas aList.The underscore will match the "empty list" case. We could have also expressed_ -> "empty list"as[] -> "empty list"orList.empty -> "empty list".All three are valid ways of testing for the empty list case.

You can also pattern match on thelast(right-most) element of a list in Unison:

match ["a", "b", "c"] with firsts :+ last -> last _ -> "empty list"
"c"
If you find that you're mixing up:+and+:in your pattern matches, remember that the colon:goes on the side of the COL-lection.

Let's say you wanted to pattern match on the first 2 elements of a given list. It might betemptingto do a multi item pattern match with successive+:operators,but recall thatfunction applicationfor operators always starts at the leftmost sub-expression.

🙅🏻‍♀️ This will not work:

match ["a","b","c"] with
  first +: second +: remainder -> "nope"
  _ -> "empty list"

first +: secondis expectingsecondto be a typeList,but what we're trying to express is that it's the unwrapped second element. Instead, if you want to pattern match on a particular list segment length or list segment values, you can use the[_]list constructor syntax!

Our example above can be rewritten:

match ["a", " b", "c "] with [first, second] ++ remainder -> use Text ++ first ++ " yes!" _ -> "fallback"
"a yes!"

Or if we don't care about binding the list elements to variables, we can use underscores to pattern match on any list that has exactly[_]elements:

match ["a", " b", "c "] with [_, _] ++ remainder -> "list has at least two elements" _ -> "fallback"
"list has at least two elements"