Depth (operator): Difference between revisions

Jump to navigation Jump to search
1 byte added ,  20:06, 14 September 2022
m (Text replacement - "</source>" to "</syntaxhighlight>")
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
:''This article is about the operator. See [[Depth]] for the number associated with every array and the function which returns this number.''
:''This article is about the operator. See [[Depth]] for the number associated with every array and the function which returns this number.''


{{Built-in|Depth|⍥}} is a [[primitive operator|primitive]] [[dyadic operator]] which applies its left [[operand]] function to sub-elements of its arguments specified by its right operand array. It appears in [[Extended Dyalog APL]], [[dzaima/APL]], [[J]] (as <syntaxhighlight lang=j inline>L:</syntaxhighlight>), and [[BQN]] (as <code>⚇</code>).
{{Built-in|Depth|⍥}} is a [[primitive operator|primitive]] [[dyadic operator]] which applies its left [[operand]] function to [[sub-array]]s of its arguments specified by its right operand array. It appears in [[Extended Dyalog APL]], [[dzaima/APL]], [[J]] (as <syntaxhighlight lang=j inline>L:</syntaxhighlight>), and [[BQN]] (as <code>⚇</code>).


== Introduction ==
== Introduction ==
The Depth operator is a generalisation of the [[Each]] operator (as <code>¨</code>). While Each switches application from being directly on array arguments, to be on their elements, Depth allows exact specification of the depth level of each argument that the function is applied to.
The Depth operator is a generalisation of the [[Each]] operator (as <code>¨</code>). While Each switches application from being directly on array arguments, to be on their elements, Depth allows exact specification of the depth level of each argument that the function is applied to.


Depth is closely related to [[Rank (operator)|Rank]] (<syntaxhighlight lang=apl inline>⍤</syntaxhighlight>), but while Rank specifies the [[rank]] of the final arguments of theleft operand function, Depth specifies the [[depth]] of the final arguments of the left operand function.
Depth is closely related to [[Rank (operator)|Rank]] (<syntaxhighlight lang=apl inline>⍤</syntaxhighlight>), but while Rank specifies the [[rank]] of the final arguments of the left operand function, Depth specifies the [[depth]] of the final arguments of the left operand function.


For all arguments, when applied with a non-negative right depth specification (the right operand), and also with negative depth specification even when the arguments are ragged (of non-uniform depth), <syntaxhighlight lang=apl inline>f⍥p⊢Y</syntaxhighlight> is equivalent to <syntaxhighlight lang=apl inline>f¨¨</syntaxhighlight>…<syntaxhighlight lang=apl inline>¨¨Y</syntaxhighlight> and <syntaxhighlight lang=apl inline>X f⍥p⊢Y</syntaxhighlight> is equivalent to <syntaxhighlight lang=apl inline>(⊂⊂</syntaxhighlight>…<syntaxhighlight lang=apl inline>⊂⊂X)f¨¨</syntaxhighlight>…<syntaxhighlight lang=apl inline>¨¨⊂⊂</syntaxhighlight>…<syntaxhighlight lang=apl inline>⊂⊂Y</syntaxhighlight> where "<code>xx</code>…<code>xx</code>" indicates some number of repetitions of the function or operator <code>x</code>.
For all arguments, when applied with a non-negative right depth specification (the right operand), and also with negative depth specification even when the arguments are ragged (of non-uniform depth), <syntaxhighlight lang=apl inline>f⍥p⊢Y</syntaxhighlight> is equivalent to <syntaxhighlight lang=apl inline>f¨¨</syntaxhighlight>…<syntaxhighlight lang=apl inline>¨¨Y</syntaxhighlight> and <syntaxhighlight lang=apl inline>X f⍥p⊢Y</syntaxhighlight> is equivalent to <syntaxhighlight lang=apl inline>(⊂⊂</syntaxhighlight>…<syntaxhighlight lang=apl inline>⊂⊂X)f¨¨</syntaxhighlight>…<syntaxhighlight lang=apl inline>¨¨⊂⊂</syntaxhighlight>…<syntaxhighlight lang=apl inline>⊂⊂Y</syntaxhighlight> where "<code>xx</code>…<code>xx</code>" indicates some number of repetitions of the function or operator <code>x</code>.


== Depth specification ==
== Depth specification ==
The right operand specifies the [[depth]] of sub-elements to which the left operand function is applied as follows:
The right operand specifies the [[depth]] of sub-arrays to which the left operand function is applied as follows:
For left argument <syntaxhighlight lang=apl inline>⍺</syntaxhighlight> and right argument <syntaxhighlight lang=apl inline>⍵</syntaxhighlight>,
For left argument <syntaxhighlight lang=apl inline>⍺</syntaxhighlight> and right argument <syntaxhighlight lang=apl inline>⍵</syntaxhighlight>,
<syntaxhighlight lang=apl>
<syntaxhighlight lang=apl>
   ⍤    c  ⍝ Depth-c cells of ⍵ (monadic) or both arguments (dyadic)
   ⍤    c  ⍝ Depth-c cells of ⍵ (monadic) or both arguments (dyadic)
   ⍤  b c  ⍝ Depth-b cells of ⍺ and depth-c sub-elements of ⍵ (dyadic)
   ⍤  b c  ⍝ Depth-b cells of ⍺ and depth-c sub-arrays of ⍵ (dyadic)
   ⍤a b c  ⍝ Depth-a cells of ⍵ (monadic), depth-b sub-elements of ⍺ and depth-c sub-elements of ⍵ (dyadic)
   ⍤a b c  ⍝ Depth-a cells of ⍵ (monadic), depth-b sub-arrays of ⍺ and depth-c sub-arrays of ⍵ (dyadic)
</syntaxhighlight>
</syntaxhighlight>


Line 56: Line 56:
Pair up the elements on the left with each element of each element on the right.
Pair up the elements on the left with each element of each element on the right.
<syntaxhighlight lang=apl>
<syntaxhighlight lang=apl>
       'xy',⍥0 1⊢('ab' 'cd')('AB' 'CD')  ⍝ equivalent to (⊂'xy'),¨¨('ab' 'cd')('AB' 'CD')
       'xy',⍥¯1⍥¯1⊢('ab' 'cd')('AB' 'CD')  ⍝ equivalent to (⊂'xy'),¨¨('ab' 'cd')('AB' 'CD')
┌─────────┬─────────┐
┌─────────┬─────────┐
│┌───┬───┐│┌───┬───┐│
│┌───┬───┐│┌───┬───┐│

Navigation menu