The monadic operator ⍨
is defined and modeled as follows:
f⍨ ⍵ ←→ ⍵ f ⍵
⍺ f⍨ ⍵ ←→ ⍵ f ⍺
{⍺←⍵ ⋄ ⍵ ⍺⍺ ⍺}
Reflex
Some common well-known functions can be written as f⍨
where f
is itself a well-known function:
+⍨
double
×⍨
square
?⍨
random permutation
⍳⍨
self-index, APL Amuse-Bouche 3
See http://www.jsoftware.com/jwiki/Essays/Reflexive for further examples.
Awareness of the importance of the reflexive case might have led us to avoid the mistake in the definition of the dyadic case of ⍋
. That is, if
⍺⍋⍵ ←→ ⍺⌷⍨⊂⍋⍵
then ⍋⍨⍵
would be sort. Ken Iverson seemed to have had this awareness because that’s how he defined the dyadic case of ⍋
in J. (I say “seemed” because he expressed surprise when first shown this use of ⍋⍨
.)
The monadic case f⍨
came relatively late. It was not in Operators and Functions (1978) nor Rationalized APL (1983), and only introduced in A Dictionary of APL (1987). It came to Ken Iverson when he explicitly looked to natural languages for inspiration, whence it became “obvious”: f⍨⍵ ←→ ⍵ f ⍵
is the reflexive voice (je m’appelle Roger) and ⍺ f⍨ ⍵ ←→ ⍵ f ⍺
is the passive voice (the programming competition was won by a 17-year-old student vs. a 17-year-old student won the programming competition), both having evolved in natural languages for effective communication and elegant expression.
Commute
The alternative definition of ⍺⍋⍵
above, while illustrating the importance of the reflexive case (f⍨ ⍵
), also illustrates the passive case (⍺ f⍨ ⍵
). ⍺⌷⍨⊂⍋⍵
can be read and understood as “⍺
indexed by the enclosed grade of ⍵
“, a different (and in my mind a better) emphasis than (⊂⍋⍵)⌷⍺
, “the enclosed grade of ⍵
, indexed into ⍺
“.
I note that Arianna Locatelli, winner of the 2015 APL Problem Solving Competition but an APL beginner, used ⍨
twenty-one times in her presentation at Dyalog ’15. For example,⍨
was used in the computation of the standard deviation (slide 13):
sol5←{a←,⍵ ⋄ ⊃0.5*⍨(⍴a)÷⍨+/2*⍨a-(⍴a)÷⍨+/a}
I believe this formulation comes naturally because ⍨
can be used to write functions in the order that they are applied. Another way to put it is that ⍨
reduces the need for long-scope parentheses. For example:
(2×a) ÷⍨ (-b) (+,-) 0.5 *⍨ (b*2)-4×a×c
((-b) (+,-) ((b*2)-4×a×c)*0.5) ÷ 2×a
That ⍨
is easy to implement, {⍺←⍵ ⋄ ⍵ ⍺⍺ ⍺}
, is neither here nor there; its value as a tool of thought is easily demonstrated.