Function rank: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
Miraheze>Adám Brudzewsky
m (Text replacement - "</code>" to "</source>")
Miraheze>Marshall
No edit summary
Line 1: Line 1:
In [[SHARP APL]], [[Rationalized APL]], and [[J]], function rank refers to a built-in property of a function indicating which argument [[Rank|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 <source lang=apl inline>f</source> may be viewed using <source lang=apl inline>f b. 0</source> and another function <source lang=apl inline>g</source> may be given those ranks using <source lang=apl inline>g"f</source> (<source lang=apl inline>"</source> is the Rank operator). Every language with function rank defines [[Close composition|"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.
In [[SHARP APL]], [[Rationalized APL]], and [[J]], '''function rank''' refers to a built-in property of a function indicating which argument [[rank]]s 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 <source lang=apl inline>f</source> may be viewed using <source lang=apl inline>f b. 0</source> and another function <source lang=apl inline>g</source> may be given those ranks using <source lang=apl inline>g"f</source> (<source lang=apl inline>"</source> is the Rank operator). Every language with function rank defines [[Close composition|"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 ==
== History ==
Line 9: Line 9:
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.
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 [[Monad|monadic]] case plus two for the arguments in the [[Dyad|dyadic]] case. These ranks may be [[Infinity|infinite]], or larger than the [[maximum rank]] if there is one, in which case they have no effect on the function's application.
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 [[Infinity|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:
A function's rank is obtained from its definition:
* Ranks of [[Primitive function|primitive functions]] are defined by the interpreter.
* Ranks of [[primitive function]]s 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 [[derived function]] are determined by its operands. For most operators they are infinite; for [[close composition]]s 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.
* 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.
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.

Revision as of 13:28, 14 November 2019

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:

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.

References

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