@@ -0,0 +1,161 @@
3+Pattern matching deconstructs a value to bring zero or more expressions into scope. Pattern matches are introduced with the `case` keyword.
5+Pattern matches have the following general form
14+Pattern matching can also be used in the declaration of functions, as we have already seen:
17+fn pattern_1 ... pattern_n = result
20+Any of the above types of pattern are also valid when introducing functions. In addition, patterns can also be grouped in parentheses to introduce multiple-arugument functions. For example,
23+example x (y, z) w = x * y + z * w
26+The following pattern types are supported:
37+Patterns need not be exhaustive. A pattern match failed exception will be thrown at runtime if no pattern matches the input.
41+The wilcard `_` matches any input and brings nothing into scope:
50+Literal patterns are provided to match on primitives:
68+A variable pattern matches any input and binds that input to its name:
72+ result -> bar(result)
77+Array patterns match an input which is an array, and bring its elements into scope.
82+f = \arr -> case arr of
84+ [x, y] -> x * y + f xs
88+Here, the first pattern only matches arrays of length one, and brings the first element of the array into scope.
90+The second pattern matches arrays with two elements, and brings the first and second elements into scope.
94+The head and tail of a non-empty array can be matched by using a cons pattern:
97+add = \arr -> case arr of
102+`:` associates to the right:
105+addPairs = \arr -> case arr of
106+ x : y : xs -> x * y + addPairs xs
112+Record patterns match an input which is a record, and bring its properties into scope.
116+ { foo = "Foo" } -> o.bar
122+The patterns above can be combined to create larger patterns.
128+ { arr = x : _, take = "car" } -> x
129+ { arr = _ : x : _, take = "cadr" } -> x
135+Named patterns bring additional names into scope when using nested patterns. Any pattern can be named by using the `@` symbol:
138+f = \arr -> case arr of
139+ a@(_ : _ : _) -> true
143+Here, in the first pattern, any array with two or more elements will be matched and bound to the variable `a`.
147+Guards are used to impose additional constraints inside a pattern using boolean-valued expressions, and are introduced with a pipe after the pattern:
150+evens = \arr -> case arr of
152+ x : xs | x % 2 == 0 -> 1 + evens xs
156+When defining a function, guards appear after all patterns:
159+greater x y | x > y = true