Optional and Default Arguments

Sometimes you may want to set up functions where certain arguments, if omitted, are given "default values". The pattern x_:v stands for an object that can be omitted, and if so, will be replaced by the default value v.

This defines a function j with a required argument x, and optional arguments y and z, with default values 1 and 2, respectively:

j[x_,y_:1,z_:2]:=jp[x,y,z]

The default value of z is used here:

j[a,b]

Now the default values of both y and z are used:

j[a]

Pattern objects with default values.

Some common Wolfram Language functions have built-in default values for their arguments. In such cases, you need not explicitly give the default value in x_:v, but instead you can use the more convenient notation x_. in which a built-in default value is assumed.

Some patterns with optional pieces.

Here a matches the pattern x_+y_. with y taken to have the default value 0:

{f[a],f[a+b]}/.f[x_+y_.]->p[x,y]

Because (RefLink[Plus, paclet:ref/Plus]) is a flat function, a pattern such as x_+y_ can match a sum with any number of terms. This pattern cannot, however, match a single term such as a. However, the pattern x_+y_. contains an optional piece, and can match either an explicit sum of terms in which both x_ and y_ appear, or a single term x_, with y taken to be 0.

Using constructs such as x_., you can easily construct single patterns that match expressions with several different structures. This is particularly useful when you want to match several mathematically equal forms that do not have the same structure.

The pattern matches g[a^2], but not g[a+b]:

{g[a^2],g[a+b]}/.g[x_^n_]->p[x,n]

By giving a pattern in which the exponent is optional, you can match both cases:

{g[a^2],g[a+b]}/.g[x_^n_.]->p[x,n]

The pattern a_.+b_.x_ matches any linear function of x_:

lin[a_.+b_. x_,x_]:=p[a,b]

In this case, b → 1:

lin[1+x,x]

Here b → 1 and a → 0:

lin[y,y]

Standard Wolfram Language functions such as (RefLink[Plus, paclet:ref/Plus]) and (RefLink[Times, paclet:ref/Times]) have built-in default values for their arguments. You can also set up defaults for your own functions, as described in "Patterns".

Sometimes it is convenient not to assign a default value to an optional argument; such arguments can be specified with the help of (RefLink[PatternSequence, paclet:ref/PatternSequence])[].

Optional argument without a default value.

The pattern matches an optional second argument of 2, without a default value:

{g[1],g[1,1],g[1,2]}/.g[x_,2|PatternSequence[]]:>p[x]