6.11 Higher-Order Functions
There are several expression constructions in Stan that act as higher-order functions.4
The higher-order functions and the signature of their argument functions are listed in the higher-order functions table.
Higher-order Functions Table. Higher-order functions in Stan with their argument function types. The first group of arguments has no restrictions. The second group of arguments, consisting of a real and integer array in all cases, must be expressions involving only data and literals.
function | unrestricted args | data args | return type |
---|---|---|---|
algebra_solver |
vector, vector |
real[], int[] |
vector |
integrate_1d , |
real, real, real[] |
real[], int[] |
real |
integrate_ode_X , |
real, real[], real[] |
real[], int[] |
real[] |
map_rect |
vector, vector |
real[], int[] |
vector |
For example, the rectangular mapping function might be used in the following way to compute the log likelihood of a hierarchical model.
functions {
vector foo_ll(vector phi, vector theta, real[] x_r, int[] x_i) {
...
...
vector[11] phi;
vector[2] thetas[N];
real x_rs[N, 5];
real x_is[N, 0];
...
target += sum(map_rect(foo_ll, phi, thetas, x_rs, x_is));
The function argument is foo
, the name of the user-defined
function; as shown in the higher-order functions table, foo
takes two vectors, a real array, and an integer array as arguments and
returns a vector.
Functions Passed by Reference
The function argument to higher-order functions is always passed as the first argument. This function argument must be provided as the name of a user-defined or built-in function. No quotes are necessary.
Data-Restricted Arguments
Some of the arguments to higher-order functions are restricted to data. This means they must be expressions containing only data variables, transformed data variables, or literals; the may contain arbitrary functions applied to data variables or literals, but must not contain parameters, transformed parameters, or local variables from any block other than transformed data.
For user-defined functions the qualifier data
may be prepended
to the type to restrict the argument to data-only variables.
Internally, they are implemented as their own expression types because Stan doesn’t have object-level functional types (yet).↩