List
Pattern matching onList
elements has its own special syntax. Thedocumentation forList
goes in-depth about the data structure itself, check it out!
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 elementhead
to its text value"a"
while keeping the remaining elementstail
as 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"
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 +: second
is expectingsecond
to 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 -> first Text.++ " 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"