# Function rank

In SHARP APL, Rationalized APL, and J, **function rank** refers to a built-in property of a function indicating which argument ranks it accepts. A function will be applied as though it were given that rank with the Rank operator. The function rank may also have other observable effects: in J, the ranks of `f`

may be viewed using `f b. 0`

and another function `g`

may be given those ranks using `g"f`

(`"`

is the Rank operator). Every language with function rank defines "close" composition operators which inherit the rank of their right operand—the derived function produced by such a composition has ranks derived from that function's ranks.

## History

Function rank was first introduced without being given a name in SHARP APL, as a feature of the compositions with and over. New compositions such as `f⍤g`

were described as "close in the sense that the expression… is applied individually to each subarray argument of `g`

".^{[1]} The concept of function rank was formalized, and applied to most primitives, when the Rank operator was introduced to SHARP version 19.0 in 1987.^{[2]} In J every function, primitive or user-defined, has a function rank.

## Definition and properties

A function with rank applies only to cells of the appropriate rank. In order to operate on those cells it will map over arguments of larger rank as though the Rank operator were applied to it.

As the Rank operator accepts up to three specified ranks in its right argument, a function with a defined function rank has three ranks, one for the argument in the monadic case plus two for the arguments in the dyadic case. These ranks may be infinite, or larger than the maximum rank if there is one, in which case they have no effect on the function's application.

A function's rank is obtained from its definition:

- Ranks of primitive functions are defined by the interpreter.
- The ranks of a derived function are determined by its operands. For most operators they are infinite; for close compositions they are obtained from the right argument, and for functions derived from the Rank operator they are obtained from the right operand.
- The ranks of a user-defined function are infinite.

It is not possible to modify the ranks of a function. Instead, apply the Rank operator to create a new function which has the given rank, but functions like the left operand on arrays of that rank. Notably, given a function is defined with a particular rank, it is impossible to make it work on arrays of a higher rank. Applying Rank with larger numbers will produce a function whose rank is higher, but the function's results will be no different: the inner function will still map over cells because it retains its rank.

## External links

J resources:

- Loopless Code I: Verbs Have Rank from
*J for C Programmers* - Intrinsic Ranks from
*Learning J* - Verb Rank from the J Primer
- The rank of a verb from "Rank in a hurry"

## References

- ↑ K.E. Iverson. "Composition and Enclosure". SATN 41, 1981-06-20.
- ↑ Bernecky, Robert. "An Introduction to Function Rank". APL88 Conference Proceedings.
*ACM SIGAPL Quote Quad*, 18(2), December 1987.

APL features [edit]
| |
---|---|

Built-ins | Primitives (functions, operators) ∙ Quad name |

Array model | Shape ∙ Rank ∙ Depth ∙ Bound ∙ Index (Indexing) ∙ Axis ∙ Ravel ∙ Ravel order ∙ Element ∙ Scalar ∙ Vector ∙ Matrix ∙ Simple scalar ∙ Simple array ∙ Nested array ∙ Cell ∙ Major cell ∙ Subarray ∙ Empty array ∙ Prototype |

Data types | Number (Boolean, Complex number) ∙ Character (String) ∙ Box ∙ Namespace |

Concepts and paradigms | Conformability (Scalar extension, Leading axis agreement) ∙ Scalar function (Pervasion) ∙ Identity element ∙ Complex floor ∙ Total array ordering ∙ Tacit programming (Function composition, Close composition) ∙ Glyph |

Errors | LIMIT ERROR ∙ RANK ERROR ∙ SYNTAX ERROR ∙ DOMAIN ERROR ∙ LENGTH ERROR ∙ INDEX ERROR ∙ VALUE ERROR |